[英]Git Rebase vs “Reverse Merge”
在git的,如果我有一個舊的功能,讓我們稱呼它, feature/improvement
地支master
高手指點像500名提交, feature/improvement
需要更新我看到3個選項。
2似乎對我來說是最直接的選擇,它顯示了合並提交,並且顯示了舊的更改,並被重新應用於最新的主更改。
但是工具和歷史非常混亂,因為它是“向后”或“反向”的
我是否誤解了一些基本知識? 有我不明白的明顯缺點嗎?
為什么要變基?
編輯:
根據要求,我創建了一個“反向合並”的演示倉庫,對於糟糕的git命令/錯字,我深表歉意。
306 touch demo.txt
307 echo "1" > demo.txt
308 git add demo.txt
309 git commit "Master 1"
310 git status
311 git commit -m "Master 1"
312 echo "2" > demo.txt
313 git commit "Master 2"
314 git add .
315 git commit -m "Master 2"
316 git status
317 git log
318 git branch feature
319 git checkout feature
320 echo "a" > demo.txt
321 echo "b" > demo.txt
322 echo "c" > demo.txt
323 git commit -m "feature c"
324 git add .
325 git commit -m "feature c"
326 echo "d" > demo.txt
327 git commit -m "feature d"
328 git add .
329 git commit -m "feature d"
330 git checkout master
331 echo "3" > demo.txt
332 git add .
333 git commit -m "master 3"
334 echo "4" > demo.txt
335 git add .
336 git commit -m "master 4"
337 echo "5" > demo.txt
338 git add .
339 git commit -m "master 5"
340 git branch feature2
341 git checkout feature2
342 git merge help
343 git help merge
344 git merge feature
345 git add .
// This is where I gave up, and Used Source Tree to use a GUI to reset feature to feature2's ref
346 git status
347 git commit
348 git status
349 echo "e" > demo.txt
350 git add .
351 git commit -m "feature e"
352 checkout -b "master"
353 git checkout master
354 git commit -m "master 6"
355 echo "6" > demo.txt
356 git add .
357 git commit -m "master 6"
合並將采用master
所有更改,並嘗試將其與feature/improvement
的更改合並。 請原諒可憐的ASCII圖...
master -------------
feature \----\--
^ ^
Branch Merge
更改基准將接受feature/improvement
所有更改,並實際上將它們移動,就好像它們在提交master
更改之后已提交一樣。
重置前:
master -------------
feature \------
^
Branch
重新設定基准后:
master -------------
feature \------
^
Branch
換一種說法:
@Jim Wright的答案很好。 關於$ git rebase
一些其他想法:
沒有。 兩種操作在完成時將產生相同的源代碼。
Git的變基操作將使您的項目歷史更加線性,因此更易於閱讀。
git rebase
這樣的命令不能“重寫”提交歷史嗎? 我認為改基不好。 這是保持歷史可讀性的非常有用的技術。 清晰易讀的VCS歷史記錄有助於理解項目的發展。 我建議保持整潔,即使需要一點額外的努力。
另一方面,如果您正在使用已發布的主題分支,則應避免使用會重寫歷史記錄的操作,因為這可能會影響撤消該分支的其他團隊成員。 就是說,一些團隊(如我的團隊)具有關於在主題分支上重寫歷史記錄的寬松規則。 我的團隊很小。 如果我確信沒有其他人取消我的分支機構,那么我可能會調整基准。 合並拉取請求時,我還將例行地根據過時的主題分支進行基准調整。
Git永遠不會覆蓋任何提交。 它會復制或重放提交以進行諸如變基之類的操作。 實際上,在一段時間內,復制的Git提交仍將通過reflog可用。 它們不會通過變基操作自動銷毀,可以在必要時進行恢復。
我不知道反向合並。 但是在這種情況下,我們有兩種選擇。 首先, git rebase
。 讓我們看看變基的作用。 考慮以下歷史記錄:master:c1,c2,c3,c4改進:c1,c2,c5,c6,c7 got checkout improvement
git rebase master
現在,首先刪除您在yot分支上所做的所有提交,然后重新進行來自母版的提交將被應用,以使您的歷史記錄與母版相同。 在此之后,rebase將把您的工作應用在其頂部。
您的歷史記錄變為:c1,c2,c3,c4,c5,c6,c7
根據我的說法,這確實使事情變得很復雜,但是如果您已經將更改從improvement
推到遠程,則不建議進行重新設置基准,因為這可能會導致重復的提交。
第二,git merge,
它將來自master分支的提交應用於合並分支。 如果您已經遠程推送了巡回分支,建議使用此功能。
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.