2014-01-30 253 views
4

經過一些玩遙控器後,我結束了所有的提交翻倍。例如。而不是Git刪除重複提交

C3107 
.. 
C3 
C2 
C1 

C3107 
C3107 
.. 
C3 
C3 
C2 
C2 
C1 
C1 

一倍哪裏有提交相同的名稱,但不同的哈希值。問題是我注意到它太晚了,沒有在它上面增加一大堆提交。

有沒有辦法刪除重複的提交,而不是我添加的鬆散的提交?

P.S .:如果在我使用遙控器進行實驗之前,我將擁有一個存儲庫副本。

非常感謝。

UPDATE許多人在這裏問的是如何結束這樣的:我有一個回購R1,然後我創建了另一個R2。在我的R1本地副本中,我將R1的起源更改爲R2,並試圖推送,但一些大文件被github拒絕。所以我做了git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename'這讓git認爲存儲庫是不同的。然後我全部推到R2做了一些提交,並決定再次切換回R1改變原點並推送。然後我給R1增加了一些提交。

+0

默認情況下,Git不允許真正重複的提交,即提交相同的樹和前一個。你是否將'--allow-empty'傳遞給'git commit'? –

+0

更新了我的問題,並提供了有關如何擰緊回購的詳細信息。 –

+0

我有同樣的問題。我懷疑這是由自動合併提交造成的。我使用以下命令來解決它(擺脫合併提交併保留提交之前和之後的提交,但提交者和提交日期將由於創建新提交而更新):'git checkout -b tmpBranchBeforeErrorMerge oldHashBeforeErrorMerge; git rebase --onto tmpBranchBeforeErrorMerge oldHashBeforeErrorMerge headLastestHash; git branch -b new_master; git branch -d master; git分支-D tmpBranchBeforeErrorMerge; git branch -m new_master master; git push -v --set-upstream origin master:master -f' – samm

回答

0

的最後,我決定贊成採櫻桃謬誤的。

6

帶着一點魔法,詭計和很多信心,那麼答案可能是「是」。但是我完全可以用一個命令來搞砸超過3000次提交的操作!

但是,您可以通過使用interactive rebasing以交互方式進行(適度)。這有點費勁,但是你可以很好地控制發生的事情,並從git獲得良好的反饋。要開始擠壓#

這將打開一個交互式會話

+0

+1爲主張離開一切,因爲它是 – eckes

+0

它真的沒那麼難。南瓜人一直都在提交。這就是當人們爲了備份原因而頻繁提交時,你如何保持提交日誌一遍又一遍地說「安全檢查」。 – joel3000

+0

這是一個不同的問題。但既然你在這裏......我建議'git add'(並使用臨時區域)或'git commit --amend'。抵制將您的「備份」提交到中央存儲庫的誘惑。這只是不需要。 –

4

git的變基-i #commit ID。切換除堆棧中第一次提交以外的所有內容至 fixup或squash。

pick 07520cd Caught file exists issue. # this is last commit 
fixup 3b71b9f Added README.   # fixup will squash the commit 

# Rebase b041966..3b71b9f onto b041966 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# x, exec = run command (the rest of the line) using shell 
# 
# These lines can be re-ordered; they are executed from top to bottom. 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# 
# However, if you remove everything, the rebase will be aborted. 
# 
# Note that empty commits are commented out 

我有一個git koan(koan 8),它會引導你通過git rebase -i。

https://github.com/jbremson/git_koans(工作正在進行中)