2012-12-19 42 views
19

我仍然試圖學習Git的(基本?)更精細的點,並設法讓自己陷入麻煩。我意識到我在HEAD上犯了一些錯誤,檢查了一個較舊的提交併從那裏開始編碼。當我嘗試推送時,我被告知我的當前提交已落後,我需要與HEAD合併。 Git推薦「git pull」。但是,HEAD有我想忽略的代碼。我該如何解決這個問題?非常感謝幫忙。如何在Git中創建較舊的提交HEAD?

流程圖:

-------- HEAD (bad) ---------------------- + (behind conflict, requires 
    \         / merge with HEAD, which is 
     \------- Current commit (good) ----/ bad and needs to be ignored) 

回答

9

如果資源庫沒有被其他的人,你可以放心地做git push -f覆蓋遠程分支。

+6

-1:'git push -f'並不真正與「安全地」在一起......我建議你要麼澄清陷阱,要麼將措辭改爲「carefu伊利「 - 相反的意思。 – ANeves

+1

@收到我支持我的措辭。如果您是使用存儲庫的唯一人員,這是完全安全的。他表示的意圖是用當地的工作*覆蓋原有分支的現狀。這正是* git push -f的目的。 – meagar

+1

我同意它看起來像他只需要一個'push -f'。 –

2

ANeves是對的,「git push -f」只能用,因爲你是唯一使用存儲庫的人。對大多數人來說這不是一個可以接受的解

這裏是您當前的提交歷史:

---A-B < HEAD (bad) 
    \ 
    C < my_branch (good) 

這有您需要的解決方案: How do I 'overwrite', rather than 'merge', a branch on another branch in Git?

總括來說,

git checkout my_branch 
git merge -s ours HEAD 

這會踐踏所有的HEAD的分支的變化,並給你以下內容:

--A-B-D < HEAD, my_branch (both good) 
    \/
    C 

D在這種情況下與C實際上是相同的,它只是有不同的父母。

+0

請勿使用「HEAD」。它應該是「合併 - 我們的舊分支」。結賬時,HEAD會改變。 –

15

這裏是你可以做什麼:

git checkout <branch-to-modify-head> 
git reset --hard <commit-hash-id-to-put-as-head> 
git push -f 

如果不強制推送,git會拋出這個錯誤:更新被拒絕,因爲你的當前分支的尖端後面。

請注意,這會篡改您的git歷史記錄,因此執行此操作的另一種方式是還原您不想要的每個提交。你保留你的歷史這樣的話:

git revert commit-id 

乾杯

4

我做到這一點的方法是:

git reset --hard <commit-SHA> 
git push origin HEAD:<name-of-remote-branch> 

這是git的建議的方式,做git push -f可能是其他人在一個小問題開發團隊

相關問題