簡體   English   中英

Git Rebase與“反向合並”

[英]Git Rebase vs “Reverse Merge”

在git的,如果我有一個舊的功能,讓我們稱呼它, feature/improvement地支master高手指點像500名提交, feature/improvement需要更新我看到3個選項。

  1. 將母版合並到功能/改進中
  2. 將功能/改進合並到master指向的提交上,然后將功能/改進的branchref更改為指向新的合並提交。
  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永遠不會覆蓋任何提交。 它會復制或重放提交以進行諸如變基之類的操作。 實際上,在一段時間內,復制的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM