簡體   English   中英

從先前的提交中獲取Git分支並從主服務器中提取更改

[英]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創建一個分支。這是我嘗試過的。

  1. 在提交2創建本地和遠程分支

    git checkout分支mybranch hashtag-of-commit2

  2. 從原點/原點(當前)提取更改以添加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文件,您不僅有以下選擇:

1.簡單顯示C的狀態

git show顯示某個修訂版中文件的內容。 所以

git show Commit2:C > /path/to/C  

將打印文件C的內容,並將其存儲在/path/to/C 我們仍然需要將其再次添加到索引中:

git add /path/to/C && git commit -m "restoring C"

2.部分還原提交

我們知道, Commit3中的C是以我們不希望的方式更改的。 要從Commit3C 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"

3.重新整理刪除內容

當您使用上一個選項時, 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.

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