2012-01-26 21 views
1

我現在使用SVN一會兒。但我只是使用結帳,更新和提交,因爲我只需要一個具有歷史記錄的備份。合併在Git中是強制性的嗎?

我想Git現在在一個新的項目。這是我做的:

  • 在Bitbucket中創建一個存儲庫。
  • Git克隆到我的機器。
  • 創建了幾個文件。
  • Git commit -a。
  • Git push。

一切都好。我檢查了Bitbucket,文件在那裏。那是昨天。今天我做了:

  • 增加了一些文件。
  • Git commit -a。
  • Git push。

而且我收到一條錯誤消息。我沒有保存它,但它說了一些關於快進的內容。出於某種原因,我無法將我的提交推送到存儲庫。我做了幾次提取,提交併推送,推送時得到相同的錯誤。然後我做了一次拉動,據我所知,這是一次抓取,然後是一次合併,然後一次推動,它就起作用了(有點兒)。我的存儲庫日誌現在看起來像這樣:

commit ef6b0e51c8278ef15d1d84770a56929f7c30cc63 
Merge: 15d482c ab3938a 
Author: xxx 
Date: Wed Jan 25 04:25:39 2012 -0200 

    Merge branch 'master' of bitbucket.org:xxx/xxx 

commit 15d482c0bd2e9b894afd779520dbfdbad7f43616 
Author: xxx 
Date: Tue Jan 24 03:50:43 2012 -0200 

    xxx 

commit ab3938aaacb089f1c4f3bdbb8d843a105991f776 
Author: xxx 
Date: Tue Jan 24 03:50:43 2012 -0200 

    xxx 

這很奇怪。第一次提交是正確的。這是昨天完成的。但第二個應該有今天的日期。但它與昨天的日期完全相同,直到秒。還有第三次提交,就是今天的合併。

這是應該的方式嗎?還是我做錯了什麼?我必須在提交和推送之間合併嗎?

回答

1

我想出了問題所在。我在第二次提交時檢查了「修改最後提交」。所以,基本上我做了:

  • 在Bitbucket上創建存儲庫。
  • 克隆。
  • 添加file1。
  • 提交。
  • 推。
  • 添加file2。
  • 提交 - 美元
  • 推。

我得到的錯誤是:

git.exe push --progress "origin" master:master 

To [email protected]:xxx/test_repo.git 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to '[email protected]:xxx/test_repo.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.exe pull -v --progress  "origin" 

From bitbucket.org:xxx/test_repo 
= [up to date]  master  -> origin/master 
Merge made by the 'recursive' strategy. 
Success 

然後我可以推。

修正已被推送的提交是問題。這就是爲什麼兩個提交都有相同的日期。

謝謝大家的幫助。

+0

歡迎來到SO。如果你已經回答了你自己的問題,隨意選擇它作爲答案,以幫助未來的用戶在搜索中啓用此功能。 –

1

如果你不能推送,因爲它不是快進更新,那就意味着有人將提交提交給bitbucket。快進更新是當前提交歷史記錄中前一個提交的更新,即。你沒有合併,你只是快速轉發的時間。

Pull會做一個git fetch然後一個git merge,這可能會導致或不會導致實際的合併,如果可能的話,git默認會做一個快進。

從你的日誌上面看,有一個實際的合併,所以我們又回到了原點。不知何故,一些額外的提交進入你的bitbucket存儲庫。你可能在網上做過一些修改嗎?

至於你關於需要合併的問題,不,你不需要需要來做合併。你確實需要解決這個問題。您可以通過以下兩種方式之一來完成此操作。你可以做一個合併,或者你可以做所謂的rebase。基本上git在你做rebase時會做的是重新應用你提交的差異到替代歷史的結尾。這造成了你直接在其他新作品之上完成新作的錯覺。 Git可以保留作者和提交日期,所以如果你花費很多時間進行重組,那麼歷史記錄可能會有點非線性,但是有些人更喜歡單行歷史記錄。您可以輕鬆地通過使用git pull --rebase

+0

沒有其他用戶。只有我使用這個存儲庫。如果其他用戶添加了提交,它應該顯示在日誌中,對嗎? – Italo

+0

@ user1170442:嘗試使用像gitk這樣的圖形日誌,這可能有助於明確發生了什麼。如果只有一個父代的合併提交,那麼使用'git config merge.ff'來檢查你的值爲'merge.ff'。如果它是'false',那麼git會強制合併提交:http://schacon.github.com/git/git-config.html –

+0

如果你的合併提交有兩個父母,那麼* something *設法得到以某種方式承諾你的遠程回購。再次,gitk應該幫助確定究竟是什麼以及何時/誰。 –

1

推做到衍合是唯一可能的,如果按下的分支可以在推到使用fast-forward合併分支合併,這意味着遠程分支的當前頭必須是本地的一部分分行歷史。如果您沒有將最新版本的遠程分支合併到本地分支中,推送將失敗(這與svn相同,如果您的本地版本不是最近版本,則無法提交)。

因此,看起來好像有一個提交推送到該分支(在遠程回購)之間你推昨天和你試圖推今天,雖然與給出的信息,我不能說它來自哪裏。

所以,如果你單獨(只有從一個位置)的一個分支工作,你通常可以用簡單commiting,推動脫身,否則你可能需要使用git fetch其次是git merge(或簡稱git pull),以獲得最大的最近版本的遠程分支插入你自己的,然後才能推送它。

+0

沒有其他用戶。只有我使用這個存儲庫。 – Italo

+0

@ user1170442:好吧,我只能告訴你,不知怎的,本地和全球歷史之間存在差異。沒有足夠的信息來說明它們爲什麼不同 – Grizzly

1

聽起來像其他用戶向您的BitBucket存儲庫添加了一個提交。你所描述的正是如果你的push失敗併發出git無法快進的消息會發生什麼。

很明顯,肯定發生過,因爲git日誌報告有東西合併到ef6b0e5中。

你找到了解決方案:你必須在Git允許你推送你的更改之前從Bitbucket倉庫中提取(取出併合並上遊更改到你的分支)。

+0

沒有其他用戶。只有我使用這個存儲庫。如果其他用戶添加了提交,它應該顯示在日誌中,對嗎? – Italo

+0

此外,Bitbucked表示關於提交ef6b0e5: 沒有文件受到影響。此提交是15d482c0bd2e和ab3938aaacb0之間的合併。 – Italo

+0

@Matthew說:「不知怎麼的一些額外的提交進入了你的bitbucket倉庫」。它可能不是其他用戶。弄清楚這個*發生的事情可能會揭示出爲什麼你必須在推動之前拉動它。順便說一句,使用--graph選項來記錄日誌可能會有所幫助,向您展示分支是如何演變的。 – hughw