2015-02-11 176 views
0

我有一個git倉庫R,它克隆在機器A和B上。我對A和B上的代碼進行了更改。然後我將A推回R.現在,我會喜歡合併B中的更改,並使A和B重新同步。git merge,push,pull confusion

在B上,我跑了git pull。這做了一些東西。 (我不知道,我該怎麼檢查,或者我應該說:git pull - 沒有提交?)

如果我現在運行,git push,將這些更改放入respository中嗎? 如果是這樣,我怎樣才能讓A重新同步。這是對A的混帳嗎?

謝謝。

+1

如果你真的不明白'git pull'是什麼,當你做'git push'時會發生什麼,你需要在你摧毀一個(或全部三個)存儲庫之前把你的手從鍵盤上拿開。我並不想侮辱你,但是你有可能對你的代碼庫造成嚴重的損害。現在閱讀Pro Git的書[這裏](http://git-scm.com/book/en/v2),這是一個很好的資源,並且會幫助你加快速度。 – kdopen 2015-02-11 16:10:29

+0

作爲一般規則,至少在開始時應遠離'git pull'。使用'git fetch',然後使用適當的'git merge'命令。當你對Git有更好的理解時,你可以開始使用'git pull',如果你認爲它讓你的生活更輕鬆。 – Jubobs 2015-02-11 16:23:30

+0

你在哪個操作系統上? – kdopen 2015-02-11 16:25:41

回答

2

在類Unix操作系統上,以下命令將設置您在問題中描述的情況。

mkdir play && cd play 
mkdir Rtemp && cd Rtemp 
git init 
echo "This is file 1" > file1.txt 
echo "This is file 2" > file2.txt 
git add file?.txt && git commit -m "Initial Commit" 
cd .. 
git clone --bare Rtemp R 
git clone R A 
git clone R B 
cd A 
echo "edited file 1 in A" >> file1.txt 
git commit -a -m "Edited file 1 in A" 
cd ../B 
echo "edited file 1 in B" >> file1.txt 
echo "edited file 2 in B" >> file2.txt 
git commit -a -m "Edited both files in B" 
cd .. 

在這一點上,你有R和兩個克隆中央回購在ABfile.txt已在AB中編輯,file2.txt已在B中編輯。

現在你推升了變化,從AR

$ cd A 
$ git push origin master 
Counting objects: 3, done. 
Delta compression using up to 16 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 304 bytes | 0 bytes/s, done. 
Total 3 (delta 0), reused 0 (delta 0) 
To .../play/R 
    34307cc..2a925ac master -> master 

在這一點上,RA是同步的。 B有本地更改,並且是R後面的一個提交 - 但直到執行git fetch(隱含在git pull中)才知道。

$ cd ../B 
$ git fetch 
remote: Counting objects: 3, done. 
remote: Compressing objects: 100% (2/2), done. 
remote: Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
From .../play/R 
    34307cc..2a925ac master  -> origin/master 
$ 

fetch的輸出顯示git已經下載了上游存儲庫的狀態。 A git status會告訴你你的立場。

$ git status 
On branch master 
Your branch and 'origin/master' have diverged, 
and have 1 and 1 different commit each, respectively. 
    (use "git pull" to merge the remote branch into yours) 

這裏的警告標誌是注意Your branch and 'origin/master' have diverged。這是說,你需要做一個合併,我設置了那裏的方法應該是衝突

$ git merge origin/master 
Auto-merging file1.txt 
CONFLICT (content): Merge conflict in file1.txt 
Automatic merge failed; fix conflicts and then commit the result. 
$ git status 
Your branch and 'origin/master' have diverged, 
and have 1 and 1 different commit each, respectively. 
    (use "git pull" to merge the remote branch into yours) 
You have unmerged paths. 
    (fix conflicts and run "git commit") 

Unmerged paths: 
    (use "git add <file>..." to mark resolution) 

    both modified: file1.txt 

no changes added to commit (use "git add" and/or "git commit -a") 

注意,它只是抱怨file1.txt。 Git能夠將更改合併到file2.txt,因爲它只在本地進行更改。如果你現在cat file1.txt,你會看到的<<<<<<<>>>>>>以下

$ cat file1.txt 
This is file 1 
<<<<<<< HEAD 
edited file 1 in B 
======= 
edited file 1 in A 
>>>>>>> origin/master 

的對顯示衝突地區。在真正的合併中,每個文件中可能有很多。現在,您需要決定在合併之後您希望file1.txt的外觀如何,並對其進行編輯以實現目標。假設我們想要保留兩條線,我們的本地編輯發生在上游之後。因此,我們編輯並file1.txt現在看起來是這樣的:

$ vi file1.txt 
$ cat file1.txt 
This is file 1 
edited file 1 in A 
edited file 1 in B 

(注意我們去掉了衝突標誌)

現在我們需要完成合並,並把我們提交回R

$ git add file1.txt 
$ git commit -m "Resolved conflicts" 
[master 5454980] Resolved conflicts 
$ git log --oneline 
5454980 Resolved conflicts 
1673d76 Edited both files in B 
2a925ac Edited file 1 in A 
34307cc Initial Commit 
$ git push origin master 
Counting objects: 7, done. 
Delta compression using up to 16 threads. 
Compressing objects: 100% (5/5), done. 
Writing objects: 100% (7/7), 650 bytes | 0 bytes/s, done. 
Total 7 (delta 0), reused 0 (delta 0) 
To .../play/R 
    2a925ac..5454980 master -> master 

此時,BR處於同步狀態,但現在A再次位於主控制器後面。

$ cd ../A 
$ git fetch 
remote: Counting objects: 7, done. 
remote: Compressing objects: 100% (5/5), done. 
remote: Total 7 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (7/7), done. 
From /home/keith/play/gitplay/R 
    2a925ac..5454980 master  -> origin/master 
$ git status 
On branch master 
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded. 
    (use "git pull" to update your local branch) 

這次git status讓我們知道我們可以「快forward` - 這意味着將不會有衝突。

$ git merge origin/master 
Updating 2a925ac..5454980 
Fast-forward 
file1.txt | 1 + 
file2.txt | 1 + 
2 files changed, 2 insertions(+) 
git merge origin/master 
$ git log --oneline 
5454980 Resolved conflicts 
1673d76 Edited both files in B 
2a925ac Edited file 1 in A 
34307cc Initial Commit 

最後,ABR都同意和開發人員都可以繼續工作。

這似乎很多工作,但它是一個非常基本的工作流程,你會很快習慣。

一旦你真的知道你在做什麼,你會很滿意使用git安全地使用git pull及其邪惡(但非常有用)的形式git pull --rebase。但在此之前,堅持與git fetchgit merge

相關問題