git 如果某人覆蓋了我的提交,如何重新提交過去的提交



git tag delete (3)

剛剛面臨一個問題,有人覆蓋了我的整個提交,並且還有很多其他提交,現在我必須重新提交該特定提交。 任何幫助,將不勝感激。

有人合併衝突,而合併時他失去了我所有的變化。 我不知道他做了什麼,但我的改變不在那裡。 在歷史上,我的提交就在那裡,但如果我看到他的合併,我的更改將被還原。

現在我無法恢復他的合併提交,因為它包含大量文件與我比較我也不想手動逐個更改每個文件。 有沒有辦法在不影響其他人的情況下取回我的更改。


Answer #1

解決這個問題的最簡單方法是,正如Code_Ninja建議的那樣 ,使用git cherry-pick 重新提交更改。 通常, Venkataraman R推薦的方法不起作用,因為Git會告訴你沒有任何東西要合併。 (如果確實有效,也可以。)具體細節取決於具體情況。 但是,對於後人來說,讓我們來看看這種情況最常見的方式。

有人合併衝突,而合併時他失去了我所有的變化。

這對於“某人”來說非常容易。 讓我們給“某人”一個名字; 讓我們稱他為Carl the Careless。 卡爾跑:

git merge carls-feature

或者甚至是:

git pull

(雖然我建議任何初學者,比如卡爾在這裡, 避免 git pull -it更好,他直接運行git merge ,這樣他就可以了解他在做什麼)。

無論如何,卡爾現在看到了這個:

Auto-merging somefile.ext
CONFLICT (content): Merge conflict in somefile.ext

可憐的卡爾恐慌,搜索網頁(甚至可能是)尋求建議,而不是看, 如何解決Git中的合併衝突 , 1卡爾只運行:

git checkout --ours somefile.ext
git add somefile.ext
git commit

卡爾剛剛把你的工作搞砸了!

請記住,合併的目標是結合工作。 Git會嘗試單獨執行此操作,但有時Git無法自行完成此過程。 在這些情況下,Git會停止並從其操作員那裡獲得幫助。

這個人類操作員 - 如果你是合併衝突者,你就完全,完全,100%控制合併結果。 Git會相信 ,即使你告訴它,正確的結果是完全忽略了另一個人的工作,只需要你的版本。

(請注意,即使Git認為它已經正確地合併了兩個人的不同變化,Git並不總是正確的。但是你仍然有責任檢查Git是否正確。最好有一個完整的測試系統你可以使用.Git只是遵循簡單的文本組合規則,在許多情況下恰好可以正常工作。)

1此處接受的答案建議使用git mergetoolvimdiff作為工具。 我碰巧不喜歡git mergetool ,我也建議你仔細閱讀其他答案,然後嘗試看看哪種方法最適合你。 但是如果git mergetool適合你,那沒關係。 請注意, git mergetool可以使用除vimdiff之外的其他合併工具; 如果你有一個你喜歡的合併工具, git mergetool很可能能夠運行它。 Pro Git書還有其他建議,包括高級合併章節。


Answer #2

您可以鍵入以下命令:

$ git reflog

然後選擇要檢索的提交的ID。

然後鍵入以下命令:

$ git cherry-pick <'ID'>

而不是<'ID'>從上面的reflog輸入ID。

然後您將獲得該提交的更改。

現在檢查是否還有剩餘的東西:

$ git status

如果有任何內容在非分段提交中,則通過以下命令添加它並提交:

$ git add -A //Any other option or the name of the file with the path that you want to commit
$ git commit -m "Your message here for that commit"
$ git push

我希望這個答案是你所期待的。


Answer #3

您可以從舊提交中創建一個分支,然後按照git進程將更改從master合併到您的分支並處理合併衝突。

下面的步驟用於創建舊提交中的分支並結帳相同。

git branch branchname <sha1 of your old commit>
git checkout branchname  

要么

git checkout -b branchname <sha1 of your old commit>




git