2015-02-11 105 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