我有一个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