[英]Git branch from a prev commit and pull changes from master
假設我已經進行了以下提交。 所有提交都在同一分支中。 在提交3中,我刪除了C,現在我需要將C添加回當前
Commit 1: A,
Commit 2: A, C
Commit 3: A,
.
.
.
Master (current) : A, B, D
現在,我想用A,B,C和D創建一個分支。這是我嘗試過的。
在提交2創建本地和遠程分支
git checkout分支mybranch hashtag-of-commit2
從原點/原點(當前)提取更改以添加B和D
git checkout mybranch
git獲取來源
git merge原始/主
這樣做,它將刪除C並添加B和D。最終結果是A,B,D。我想要的是A,B,C和D。我該怎么辦?
我認為這個問題的意思是,在更傳統的布局中,將字母更改為數字,將數字更改為字母。
日志(單個分支)如下所示
---A---B---C---D--- .... ---- HEAD master
+x -x
提交B添加x
,提交C還原該更改。 OP希望重新添加x
。
假設您在master上(即已經具有由commit D
.. master
引入的更改),則prima facie git revert sha-1-of-C
應該做到這一點,即您正在還原已還原原始更改的提交。
我看不到這與遠程分支有什么關系。
整整git revert
也將恢復更改到A
在介紹Commit3
,所以這不是你想要的。
要將文件C
還原為Commit2
文件,您不僅有以下選擇:
C
的狀態 git show
顯示某個修訂版中文件的內容。 所以
git show Commit2:C > /path/to/C
將打印文件C
的內容,並將其存儲在/path/to/C
。 我們仍然需要將其再次添加到索引中:
git add /path/to/C && git commit -m "restoring C"
我們知道, Commit3
中的C
是以我們不希望的方式更改的。 要從Commit3
對C
Commit3
的更改(即刪除)創建補丁,我們可以使用git diff
:
git diff Commit3~..Commit3 -- /original/path/to/C > c-changes.patch
現在, c-changes.diff
保留了引入的更改。 現在,我們以相反的順序應用此補丁並還原C
:
git apply --reverse c-changes.patch
C
恢復后,將其重新添加到索引中:
git add /path/to/C && git commit -m "restoring C"
當您使用上一個選項時, Commit3
仍會刪除C
並且您還有一個額外的提交恢復C
如果自Commit3
您再也沒有推送任何Commit3
,我們可以編輯Commit3
,使其不再刪除C
首先,按照選項2所述創建補丁。然后,調用交互式git rebase
:
git rebase -i Commit2
這將在$EDITOR
彈出一個對話框。 您將看到Commit3
。 選擇e
DIT提交,保存文件並關閉文件。 然后,在應用Commit3
之后, Commit3
啟動將開始,並且將立即停止。 現在獲取補丁並以相反的順序應用它:
git apply --reverse c-changes.patch
已應用補丁,現在我們修改上一次提交,並從歷史記錄中刪除對C
的刪除:
git add /path/to/C && git commit --amend -C HEAD && git rebase --continue
此后將繼續進行重定基礎,一旦完成,您將擁有C
從未消失的全新歷史。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.