Bạn có thể hợp nhất chi nhánh ngược dòng với chi nhánh của mình dev
, với trình điều khiển hợp nhất tùy chỉnh "keepTheirs" :
Xem " " git merge -s theirs
"cần thiết - nhưng tôi biết nó không tồn tại ".
Trong trường hợp của bạn, chỉ .gitattributes
cần một và một keepTheirs
tập lệnh như:
mv -f $3 $2
exit 0
git merge --strategy=theirs
Mô phỏng # 1
Hiển thị dưới dạng hợp nhất, với ngược dòng là nguồn gốc đầu tiên.
Jefromi đề cập (trong các nhận xét) merge -s ours
bằng cách hợp nhất công việc của bạn ở thượng nguồn (hoặc trên một nhánh tạm thời bắt đầu từ ngược dòng), rồi chuyển tiếp nhanh nhánh của bạn đến kết quả của việc hợp nhất đó:
git checkout -b tmp origin/upstream
git merge -s ours downstream # ignoring all changes from downstream
git checkout downstream
git merge tmp # fast-forward to tmp HEAD
git branch -D tmp # deleting tmp
Điều này có lợi khi ghi lại tổ tiên ngược dòng là gốc đầu tiên, do đó hợp nhất có nghĩa là "tiếp thu nhánh chủ đề lỗi thời này" thay vì "hủy nhánh chủ đề này và thay thế bằng nhánh chủ đề ngược dòng" .
(Chỉnh sửa 2011):
Quy trình làm việc này đã được OP báo cáo trong bài đăng blog này :
Tại sao tôi lại muốn điều này?
Miễn là repo của tôi không liên quan gì đến phiên bản công khai, mọi thứ đều ổn, nhưng vì bây giờ tôi muốn khả năng hợp tác trên WIP với các thành viên khác trong nhóm và những người đóng góp bên ngoài, tôi muốn đảm bảo rằng các nhánh công khai của tôi đáng tin cậy để những người khác phân nhánh và lấy từ, tức là không phải rebase và đặt lại trên những thứ tôi đã đẩy sang bản sao lưu từ xa, vì nó hiện đã có trên GitHub và công khai.
Vì vậy, điều đó để lại cho tôi cách tôi nên tiếp tục.
99% thời gian bản sao của tôi sẽ đi vào bản chủ ngược dòng, vì vậy tôi muốn làm việc với bản sao của mình và đẩy vào phần lớn thời gian.
Nhưng thỉnh thoảng, những gì tôi có trong tay wip
sẽ bị vô hiệu bởi những gì đi ngược dòng và tôi sẽ từ bỏ một phần của mình wip
.
Tại thời điểm đó, tôi muốn đưa chủ của mình trở lại đồng bộ với ngược dòng, nhưng không hủy bất kỳ điểm cam kết nào trên trang chủ được đẩy công khai của tôi. Tức là tôi muốn hợp nhất với ngược dòng kết thúc với tập thay đổi làm cho bản sao của tôi giống hệt với ngược dòng .
Và đó là điều git merge --strategy=theirs
nên làm.
git merge --strategy=theirs
Mô phỏng # 2
Hiển thị như một hợp nhất, với của chúng tôi là cha mẹ đầu tiên.
(do jcwenger đề xuất )
git checkout -b tmp upstream
git merge -s ours thebranch # ignoring all changes from downstream
git checkout downstream
git merge --squash tmp # apply changes from tmp but not as merge.
git rev-parse upstream > .git/MERGE_HEAD #record upstream 2nd merge head
git commit -m "rebaselined thebranch from upstream" # make the commit.
git branch -D tmp # deleting tmp
git merge --strategy=theirs
Mô phỏng # 3
Bài đăng trên blog này đề cập đến :
git merge -s ours ref-to-be-merged
git diff --binary ref-to-be-merged | git apply -R --index
git commit -F .git/COMMIT_EDITMSG --amend
đôi khi bạn muốn làm điều này, và không phải vì bạn có "tào lao" trong lịch sử của mình, mà có lẽ vì bạn muốn thay đổi đường cơ sở để phát triển trong một kho lưu trữ công cộng, nơi nên tránh khôi phục .
git merge --strategy=theirs
Mô phỏng # 4
(cùng một bài blog)
Ngoài ra, nếu bạn muốn giữ cho các nhánh ngược dòng cục bộ có thể chuyển tiếp nhanh, một thỏa hiệp tiềm năng là làm việc với sự hiểu biết rằng đối với sid / không ổn định, nhánh ngược dòng có thể được đặt lại / khôi phục theo thời gian (dựa trên các sự kiện cuối cùng đã xảy ra kiểm soát của bạn ở phía dự án thượng nguồn).
Đây không phải là một vấn đề lớn và làm việc với giả định đó có nghĩa là rất dễ dàng để giữ cho nhánh thượng nguồn cục bộ ở trạng thái chỉ cần cập nhật nhanh.
git branch -m upstream-unstable upstream-unstable-save
git branch upstream-unstable upstream-remote/master
git merge -s ours upstream-unstable
git diff --binary ref-to-be-merged | git apply -R --index --exclude="debian/*"
git commit -F .git/COMMIT_EDITMSG --amend
git merge --strategy=theirs
Mô phỏng # 5
(do Barak A. Pearlmutter đề xuất ):
git checkout MINE
git merge --no-commit -s ours HERS
git rm -rf .
git checkout HERS -- .
git checkout MINE -- debian # or whatever, as appropriate
git gui # edit commit message & click commit button
git merge --strategy=theirs
Mô phỏng # 6
(được đề xuất bởi cùng một Michael Gebetsroither ):
Michael Gebetsroither tán tỉnh, cho rằng tôi đã "gian lận";) và đưa ra một giải pháp khác với các lệnh sửa ống nước cấp thấp hơn:
(Sẽ không là git nếu không thể thực hiện được với các lệnh chỉ git, mọi thứ trong git với diff / patch / apply không phải là một giải pháp thực sự;).
# get the contents of another branch
git read-tree -u --reset <ID>
# selectivly merge subdirectories
# e.g superseed upstream source with that from another branch
git merge -s ours --no-commit other_upstream
git read-tree --reset -u other_upstream # or use --prefix=foo/
git checkout HEAD -- debian/
git checkout HEAD -- .gitignore
git commit -m 'superseed upstream source' -a
git merge --strategy=theirs
Mô phỏng # 7
Các bước cần thiết có thể được mô tả như sau:
- Thay thế worktree của bạn bằng ngược dòng
- Áp dụng các thay đổi cho chỉ mục
- Thêm ngược dòng làm nguồn gốc thứ hai
- Cam kết
Lệnh git read-tree
ghi đè chỉ mục bằng một cây khác, hoàn thành bước thứ hai và có các cờ để cập nhật cây công việc, hoàn thành bước đầu tiên . Khi cam kết, git sử dụng SHA1 trong .git / MERGE_HEAD làm cha mẹ thứ hai, vì vậy chúng tôi có thể điền điều này để tạo một cam kết hợp nhất. Do đó, điều này có thể được thực hiện với:
git read-tree -u --reset upstream # update files and stage changes
git rev-parse upstream > .git/MERGE_HEAD # setup merge commit
git commit -m "Merge branch 'upstream' into mine" # commit