2010-01-06 179 views
10

剛纔我承諾並推了一些東西(是的,我的錯推),我決定我應該'恢復'或'撤消'。所以我被告知在我的最後發行git reset --soft HEAD^,並且我認爲這會以某種方式創建一個「恢復」提交,一旦提交就會使更改從未發生。我不介意改變的歷史是否存在,這正是我所想象的。git reset --soft HEAD^

無論如何,做完這些之後我又犯了一次,然後當我試圖推動時,我得到了非快進錯誤。現在,我知道我把重置的東西搞砸了,現在我的樹和原點樹的東西都是'不匹配'的,但我想知道如何解決這個問題。現在我只想回到發佈重置之前的時間,以便手動將它們手動取出然後提交,除非其他人可以推薦恢復推送提交的正確方法,並且通過這並不意味着歷史必須從日誌或任何東西中消失。

回答

7

如果我正確理解你的問題,你可以嘗試以下方法:

(我假設這是你的「主」分支,你是推到「原點」)

同步了遠程達到相同的狀態。

git remote update 
git checkout master 
git merge origin/master 

現在恢復你的提交

git revert HEAD (or where ever the commit you want to revert is now) 
git commit -av 

同步了遠程

git push 
0

你想使用git revert HEAD創建一個新的承諾,將撤消在HEAD的提交。相反,您只是將HEAD移回到當前HEAD之前的提交。

+0

謝謝,這是有道理的,雖然這可能會更好,因爲它並沒有真正解決我的問題。不過謝謝。 – 2010-01-06 22:10:13

5

現在我只想回去之前,我發出復位

如果你只是想取消的時候git reset --soft你只是做了,你可以看一下前負責人提交ID在reflogs

$ git reflog 
$ git reset --soft formerCommit 

然後你就可以準備git revert

+0

謝謝,這與IRC上的某個人告訴我要做的事情相似,但這很讓人困惑,所以我將與rnicholson的答案一起用於記錄目的。 – 2010-01-06 22:16:04

+1

我不熟悉git reflog。很酷。學到了新東西。這可能是一個更好的解決方案,因爲它將我的答案的前三個步驟濃縮爲一個命令。 – rnicholson 2010-01-06 22:23:10

0

雖然我的回答是超出你的要求,我認爲這實際上是你打算做的。您使用git reset --soft HEAD^撤消您提交的提交。這之前,你的承諾(因爲HEAD點返回工作副本的狀態,以你目前的承諾,並HEAD^指向一個之前(假定只有一個父)。

但是現在,當你git push你被告知的東西像:

! [rejected]   <branch> -> <branch>e (non-fast-forward) 
error: failed to push some refs to 'ssh://<remote server>/<remote path>' 
hint: Updates were rejected because the tip of your current branch is behind 
hint: its remote counterpart. Integrate the remote changes (e.g. 
hint: 'git pull ...') before pushing again. 
hint: See the 'Note about fast-forwards' in 'git push --help' for details. 

這是說,提交不排隊,它的存在阻止你犯了一個錯誤,錯誤消息是有點誤導,你不想做什麼暗示。 (拉動你的分支同步)你只能知道不這樣做是因爲你的意圖。

可以解決這個只是得到一個--force(或-f)(*):

git push --force 

您可能需要重新設置上游:

git push --force --set-upstream origin <branch> 

請注意,這將有如果其他人已經撤回你的工作,將會產生後果,因爲將會有不同的提交(可能)進行相同的更改。請參閱https://www.kernel.org/pub/software/scm/git/docs/user-manual.html#problems-With-rewriting-history

爲了防止,永遠只能做推到你的分支任何問題(不是一些公共分支 - 例如development分支的開發者合併其所有功能分支成),並一定要在你的團隊開放的溝通

開發人員將通常使用這個模式我稱之爲週五下午提交您希望在情況的硬件故障週末前保存您的工作(但回到上週一提交前的狀態) 。

*Friday* 

git add --all # To add all files whether they are tracked or not 
git commit -m "Friday afternoon commit" 
git --set-upstream push  # --set-upstream is for if the branch doesn't exist on the remote server 

*Monday* 

git reset --soft HEAD^ 
git push -f --set-upstream origin <branch> 

做這種方式,而在另一個答案討論git revert的好處,是避免多餘的提交。重置將有2個提交,這種方式將沒有(沒有額外的)。 git reset的優勢在於它不會重寫歷史記錄,所以更安全,特別是如果您不確定自己在做什麼。

(*)通常將存儲庫配置爲不讓您執行此操作以便掌握 - 修復分支並創建拉取請求。因爲如果你已經閱讀過上面的鏈接,重寫master的歷史將產生嚴重的後果(除非你是唯一一個克隆該代碼的人)。

相關問題