簡體   English   中英

如何使用'git rebase -i'來重新分支分支中的所有更改?

[英]How do I use 'git rebase -i' to rebase all changes in a branch?

這是一個例子:

>git status
# On branch master
nothing to commit (working directory clean)
>git checkout -b test-branch
>vi test.c
>git add test.c
>git commit -m "modified test.c"
>vi README
>git add README
>git commit -m "modified README"

現在我想做一個' git rebase -i ',它會讓我為這個分支重新提交所有提交。 有沒有像' git rebase -i HEAD~MASTER '或類似的東西。 我想我可以做' git rebase -i HEAD~2 ',但我真的不想計算已經做了多少次提交。 我也可以' git rebase -i sha1 ',但我不想通過git log來查找第一個提交sha1。 有任何想法嗎?

好吧,我認為分支被稱為“特征”,它從“主”分支。

有一個叫做merge-base的小git命令。 它需要兩次提交,並為您提供這兩者的第一個共同祖先。 所以...

git merge-base feature master

...將為您提供這兩個提交的第一個共同祖先。 猜猜當你將這個提交傳遞給git rebase -i時會發生什么,比如......

git rebase -i `git merge-base feature master`

來自master和feature分支的第一個共同祖先的交互式rebase。 利潤! ;)

所有提供的解決方案的問題是,它們不允許您從第一次提交時進行rebase。 如果第一個提交哈希值是XYZ,那么您執行以下操作:

git rebase -i XYZ

您只從第二次提交開始重新綁定。

如果你想從第一次提交改變:

git rebase -i --root

你試過嗎: git rebase -i master

在其他平台上使用gitk(* nix)或gitx(OS X)或類似的東西,並查看哪個提交是您的分支的根目錄。 然后運行:

git rebase -i <the SHA hash of the root commit>

例如,我有一個我使用gitx檢查的存儲庫:

gitx screencap

現在我知道根哈希我可以運行這個:

git rebase -i 38965ed29d89a4136e47b688ca10b522b6bc335f

我的編輯彈出這個,我可以重新排列/擠壓/隨心所欲。

pick 50b2cff File 1 changes.
pick 345df08 File 2 changes.
pick 9894931 File 3 changes.
pick 9a62b92 File 4 changes.
pick 640b1f8 File 5 changes.
pick 1c437f7 File 6 changes.
pick b014597 File 7 changes.
pick b1f52bc File 8 changes.
pick 40ae0fc File 9 changes.

# Rebase 38965ed..40ae0fc onto 38965ed
#
# Commands:
#  pick = use commit
#  edit = use commit, but stop for amending
#  squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

我確信有一些神奇的方法來說服git自動找出樹的根,但我不知道它是什么。

編輯:這就是魔術:

git log master..other_feature | cat

這將顯示該分支上的所有提交,並且對cat的管道將禁用尋呼機,以便您立即看到第一個提交。

編輯:結合上面提供了一個完全自動化的解決方案:

git rebase -i  `git log master..other_feature --pretty=format:"%h" | tail -n 1`~

從不同的分支重新定位的問題

git rebase -i master的問題在於,您可能會遇到目前不一定要處理的合並沖突,或者您可能在一次提交中修復沖突,只是在課程中再次修復它的變化。

從已知提交重新定位的問題

這里的整個問題是你必須知道你要引用哪個提交,無論是通過它的SHA,還是HEAD~x等。這只是一個小麻煩,但這是一個煩惱。

更好的方法

如果您想要重新綁定當前分支中的所有提交,因為它與其父分支共享的最新提交,您可以將以下別名添加到.gitconfig:

rbi = !sh -c \"git rebase -i `git merge-base $1 HEAD`\" -

用法

git rbi parentBranch

這個怎么運作

這個別名只是一個shell腳本,它使用一個引用父分支的參數。 該參數被傳遞到git merge-base ,以確定該分支與當前分支之間的最新共享提交。

從Git v1.7.10開始,你可以在沒有參數的情況下運行git rebase ,它會找到fork point並在上游分支上重新定義你的本地更改。

你需要配置上游分支才能工作(即沒有參數的git pull應該工作)。

有關更多詳細信息,請參閱git rebase的文檔:

如果未指定,將使用branch..remote和branch..merge選項中配置的上游(有關詳細信息,請參閱git-config [1]),並假定使用--fork-point選項。 如果您當前不在任何分支上,或者當前分支沒有配置上游,則rebase將中止。

一般解決方案(如果您不知道上游分支的名稱)是:

git rebase -i @{upstream}

請注意,如果您的上游(可能是跟蹤分支)自上次重新定位后已更新,您將從上游引入新的提交。 如果您不想提取新提交,請使用

git rebase -i `git merge-base --all HEAD @{upstream}`

但那有點拗口。

git rebase -i --onto @{u}... @{u}

交互式rebase從HEAD及其上游的單個合並點開始,包括HEAD中不在其上游的所有提交。

換句話說,正是你想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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