我有一個本地Git倉庫,我一直在開發幾天:它迄今有18個提交。今晚,我創建了一個私人的Github存儲庫,我希望能推動它;然而,當我這樣做的時候,它最終只能將十八個提交中的八個提交給Github。我刪除了Github repo並重新嘗試,結果相同。將現有的Git存儲庫推送到Github只發送大約一半的提交?
有關爲什麼會發生這種情況的任何想法?我之前沒有成功完成這個程序,所以我有點難住。
更新:有,並且一直只有在這個回購中的主分支。只是爲了解決一些已發佈的答案...
我有一個本地Git倉庫,我一直在開發幾天:它迄今有18個提交。今晚,我創建了一個私人的Github存儲庫,我希望能推動它;然而,當我這樣做的時候,它最終只能將十八個提交中的八個提交給Github。我刪除了Github repo並重新嘗試,結果相同。將現有的Git存儲庫推送到Github只發送大約一半的提交?
有關爲什麼會發生這種情況的任何想法?我之前沒有成功完成這個程序,所以我有點難住。
更新:有,並且一直只有在這個回購中的主分支。只是爲了解決一些已發佈的答案...
我接過一看有問題的資料庫,這裏是發生了什麼事情:
git checkout [commit id]
。這指出HEAD在一個鬆散的提交而不是一個公認的分支。我相信這是CesarB所指的「搖搖欲墜的HEAD」問題。此圖應該更清楚:
-- D -- E -- F
/ ^
A -- B -- C - |
^ ^ HEAD
| |
remote master
當他試圖把他的變化,只有通過A
被C
推remote
上升到C
。他無法提交D
通過F
推動,因爲它們不是由已知的分支引用。
這裏有你所看到的,當你處於這種狀態:
$ git branch
* (no branch)
master
的解決方案是在提交的懸掛鏈移動master
高達F
。這是我做到的。
創建當前狀態的合法分支:
git checkout -b tmp
tmp
分支正指向在提交F
在上圖中快進master
至tmp
git checkout master
git merge tmp
master
現在指着提交F
。扔掉你的臨時黨支部
git branch -d tmp
您可以愉快地推到遠程存儲庫,它應該將所有的更改。
我想我會做的第一件事就是在本地存儲庫上運行git fsck
以確保它的狀態良好。
我從來沒有見過這個問題,我想不出什麼可能是錯的。
檢查你是否推動正確的分支,並確保分支實際上擁有你認爲他們擁有的東西。特別是,檢查你是否沒有分離的HEAD,如果不是故意的,可能會令人困惑。
最簡單的檢查方法是使用gitk --all
,它以圖形方式顯示所有分支,HEAD等等。
因此,事實證明,兩者:.git/refs/heads/master中的提交散列是正確的,而.git/logs/refs/heads/master中的信息是不完整的;我的意思是它只包含了.git/refs/heads/master中指定的提交哈希。
一旦我修復了這些文件(手工),並推回到Github,一切都變成了肉汁。我仍然有不知道在這個狀態下發生了什麼事情,但我很高興至少我已經找到了解決方法。
如果有人想知道:修正.git/refs/heads/master,我只是使用最新的提交散列(HEAD)替換該文件的內容,並修復.git/logs/refs/heads /主,我只是將.git/logs/HEAD的內容複製到.git/logs/refs/heads/master中。容易peasy ...不。
我沒有信譽直接CesarB早期的回答發表評論,但gitk --all
不會在這種情況下工作,因爲它只是列出了已知的分支。
gitk HEAD
顯示了這個問題,但它並不完全清楚。冒煙槍是master
顯示在提交樹下,而不是最近的提交。
從Git的1.7.3起,你可以用一個簡單的命令做到這一點:
git checkout -B master
的-b
開關裝置「檢查出來之前,在這裏創建分支」和-B
是那個無條件版「即使分支已經存在 - 在這種情況下,在檢查出來之前將它移動到這裏「。
解決這類問題的一個非常簡單的方法就是刪除master
分支並重新創建它。畢竟,git中的分支僅僅是提交的名字,master
分支沒什麼特別的。
所以假設當前承諾是你想要master
是一個,你只需做
git branch -D master
刪除現有master
分支,然後做
git checkout -b master
到)創建稱爲master
的新分支指向當前提交併且b)更新HEAD
以指向master
分支。之後,HEAD
將附加到master
,因此master
將在您提交時向前移動。
我有兩次這個相同的問題,最後想出了我在做什麼導致它。在用git rebase -i
編輯舊提交的過程中,我不是調用git commit --amend
,而是通過習慣的強制呼叫git commit -a
,當然,緊接着是git rebase --continue
。其他人可能能夠解釋幕後發生的事情,但看起來結果是分離的HEAD問題。
如果你想謹慎的話,這種方法很好;如果您知道合併將快進,那麼您可以刪除並重新創建分支。看到我的答案。 – 2008-11-10 00:27:04