2012-04-09 58 views
9

服務器上有一個Git存儲庫,我和我的同事一起推送。只要我們在提交之前拉動,它就可以正常工作。爲什麼Git拒絕我的拉只是因爲我有我的本地分支提交?

但是,如果他已經推送到主分支,並在平均時間我已經做了本地提交,當我試圖拉我得到這個:

! [rejected]  master -> master (non-fast-forward) 

但我知道,應該有沒有衝突。

我周圍獲得的方式是通過拉動到一個新的臨時黨支部,然後合併結果表明,在我主人這樣的:

% git pull origin master:temp 
From ssh://example.com/home/my/remote/repo 
* [new branch]  master -> temp 
Already up-to-date. 
% git merge temp 
Already up-to-date. 
% git push origin master:master 

注意的Git就像我沒有做任何事情,但我真的已經動搖了它提交。

最近我意識到,不是試圖「說服」Git,我可以拉動。我可以假裝我還沒有承諾git reset --soft HEAD^git stash,然後在上面做拉和承諾。

什麼可能導致這種奇怪的挑剔行爲?

我能夠在我的本地機器上重現這個問題。以下是我所做的:

首先我創建了第一個「本地」存儲庫並添加了一個文件。

% cd 
% mkdir local-1 
% cd local-1/ 
% mkdir website 
% cd website/ 
% git init 
Initialized empty Git repository in /Users/jason/local-1/website/.git/ 
% touch file 
% git add . 
% git commit -m 'added file' 
[master (root-commit) 6d4b322] added file 
0 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 file 

然後我做了「遠程」存儲庫。

% cd 
% mkdir remote 
% cd remote 
% mkdir website.git 
% cd website.git/ 
% git init --bare 
Initialized empty Git repository in /Users/jason/remote/website.git/ 

然後我回到本地,創建了一個ref並推送到遠程。

% cd ~/local-1/website/ 
% git remote add web ~/remote/website.git 
% git push web +master:refs/heads/master 
Counting objects: 3, done. 
Writing objects: 100% (3/3), 207 bytes, done. 
Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
To /Users/jason/remote/website.git 
* [new branch]  master -> master 

之後,我將遠程克隆到第二個本地。

% cd 
% mkdir local-2 
% cd local-2 
% git clone ~/remote/website.git 
Cloning into website... 
done. 

然後,我創建了一個裁判的遠離第二本地和推動(這是我創造,我認爲這個問題)。

% cd website/ 
% git remote add web ~/remote/website.git 
% git push web +master:refs/heads/master 
Everything up-to-date 

然後我對local-2進行了更改,提交併推送。

% touch another 
% git add . 
% git commit -m 'added another' 
[master be91180] added another 
0 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 another 
% git push web 
Counting objects: 3, done. 
Delta compression using up to 4 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (2/2), 238 bytes, done. 
Total 2 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (2/2), done. 
To /Users/jason/remote/website.git 
    6d4b322..be91180 master -> master 

最後,我對local-1做了一個不同的改變,承諾,並試圖推動。

% cd ~/local-1/website/ 
% touch something 
% git add . 
% git commit -m 'added something' 
[master 3984529] added something 
0 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 something 
% git push web 
To /Users/jason/remote/website.git 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to '/Users/jason/remote/website.git' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 

爆炸!拉怎麼樣?

% git pull web master:master 
From /Users/jason/remote/website 
! [rejected]  master  -> master (non-fast-forward) 

好的,所以有問題。我如何解決它?

+0

你在開頭描述的行爲絕對不正常。 (不過,它與合併衝突無關。)在'.git/config'或'〜/ .gitconfig'中你有什麼不尋常的東西嗎?如果您不確定,請將其全部發表並測試,或發佈整件事情。 (設置'pull.twohead'可能會導致這種情況,我想......)你是否設法創建了任何奇怪的參考?運行'gitk --all'並檢查,或者更嚴格的,運行'git for-each-ref'。如果有什麼叫master的不是'refs/heads/master'或'refs/remotes/origin/master',那可能是個問題。 – Cascabel 2012-04-09 01:31:08

+0

我見過「最佳實踐」的建議,建議別名'拉'拉' - 只 - ,這會導致你描述的情況。我會特別檢查一下。 – Clueless 2012-04-09 03:31:16

+0

@無跡:啊,是的,我檢查了是否有'pull.ff-only'配置選項,但我沒有考慮到這一點。似乎是一個很好的猜測! – Cascabel 2012-04-09 05:46:08

回答

12

你大概的意思做:

git pull web master 

使用master:master試圖直接更新你這是造成非快速向前錯誤拉的獲取階段地方master分支。

如果您位於設置爲跟蹤web/master的分支,那麼您只需要git pull web,這也會更新您的遠程跟蹤分支。

+2

真棒。對於這樣一個令人尷尬的長期問題來說非常簡單! – 2012-04-18 08:46:25

+0

當我試圖將Heroku端點的主分支拉入本地開發時,我遇到了完全相同的問題。 – ganeshran 2016-01-22 07:32:45

相關問題