我有一個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的混帳嗎?
謝謝。
我有一個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的混帳嗎?
謝謝。
在類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
和兩個克隆中央回購在A
和B
。 file.txt
已在A
和B
中編輯,file2.txt
已在B
中編輯。
現在你推升了變化,從A
到R
$ 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
在這一點上,R
和A
是同步的。 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
此時,B
和R
處於同步狀態,但現在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
最後,A
,B
和R
都同意和開發人員都可以繼續工作。
這似乎很多工作,但它是一個非常基本的工作流程,你會很快習慣。
一旦你真的知道你在做什麼,你會很滿意使用git安全地使用git pull
及其邪惡(但非常有用)的形式git pull --rebase
。但在此之前,堅持與git fetch
和git merge
。
如果你真的不明白'git pull'是什麼,當你做'git push'時會發生什麼,你需要在你摧毀一個(或全部三個)存儲庫之前把你的手從鍵盤上拿開。我並不想侮辱你,但是你有可能對你的代碼庫造成嚴重的損害。現在閱讀Pro Git的書[這裏](http://git-scm.com/book/en/v2),這是一個很好的資源,並且會幫助你加快速度。 – kdopen 2015-02-11 16:10:29
作爲一般規則,至少在開始時應遠離'git pull'。使用'git fetch',然後使用適當的'git merge'命令。當你對Git有更好的理解時,你可以開始使用'git pull',如果你認爲它讓你的生活更輕鬆。 – Jubobs 2015-02-11 16:23:30
你在哪個操作系統上? – kdopen 2015-02-11 16:25:41