![](/img/trans.png)
[英]Git. Rebase local branch atop local master. How do I ignore a single files changes?
[英]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檢查的存儲庫:
現在我知道根哈希我可以運行這個:
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.