使用终端将本地和远程主分支进行Git合并

4

抱歉提出一个已经被问了一千遍的问题。但是我甚至都不知道类似的问题会是什么样子。

  • 主分支(在github.com上)有本地代码库没有的更改
  • 本地代码库有主分支没有的更改
  • 用于同步这两者的git命令是什么?

我正在使用mac终端(osx-mavericks)

如果我理解术语正确,我的代码库并不是一个派生分支,它只是主分支的本地副本。因为我忘记在对本地代码库进行更改之前拉取主分支,所以发生了分歧。现在我需要合并,但是推送不起作用。

主分支:在github.com上的远程代码库

本地代码库:在我本地电脑上的代码


这很令人困惑。你应该在问题中指定master是你给一个远程的名称,因为master通常是保留给分支的名称。 - jub0bs
你需要告诉我们更多涉及到的分支信息。git branch -a 命令会告诉你什么? - jub0bs
当我执行 git branch -a 命令时,它会返回 *master remote/projectname/master - Katedral Pillon
好的,为了确认一下,git remote -v 命令告诉你什么?另外,你是否有 GitHub 上远程仓库的写入权限?这个仓库是你自己创建的吗? - jub0bs
项目名称 https://github.com/projectpath(获取) 项目名称 https://github.com/projectpath(推送) - Katedral Pillon
是的,我拥有位于 GitHub 上的远程仓库:我拥有写入权限。 我已经使用它了几天了。 这是我第一次遇到这种情况。 - Katedral Pillon
3个回答

2

首先,请确保您的本地仓库知道远程仓库中的所有内容:运行以下命令:

git fetch

现在,根据您的问题和评论,我猜测您的本地仓库看起来像这样:

enter image description here

您本地仓库中的master分支与远程仓库中的master分支已经发生了分歧。在这种情况下,Git不允许您将(本地)master分支推送到远程仓库。

通过“同步两者”,我假设您的意思是合并master上的更改和projectname/master上的更改。 您基本上有两种方法可以实现:合并或变基。

在继续之前,请确保您正在运行master

git checkout master

(以下假设您的本地代码库使用名称为projectname来指代远程代码库。)

选项1:合并

运行以下命令:

git merge projectname/master

你的仓库将会变成这样:

enter image description here

之后,只需运行:
git push projectname master

masterprojectname/master应该是最新的(即指向相同的提交):

enter image description here

选项2(更高级...请小心操作):变基

运行

git rebase projectname/master

你的代码仓库应该长这样:

enter image description here

之后,只需运行以下命令:
git push projectname master

要保持masterprojectname/master最新(即指向相同的提交):

enter image description here


感谢详细的解释。看起来应该可以工作。所以+1。但是我已经使用@KonsolLabapan的答案实现了它,并且它可以工作。我相信更多的人可能会发现您的解释更有用作为教学/学习工具。 - Katedral Pillon

2

这是一个三步骤的过程:

  1. 提交本地更改
  2. 从远程拉取
  3. 推送到远程

按照您通常的方式提交更改:

git add --all .
git commit -m "the local changes that I have made"

然后按照您通常的方式拉取:
git pull somerepo master

我想你已经知道如何提交和拉取代码了,根据对话内容。

为了安全起见,在拉取后,我喜欢立即推送。


-1

我不确定你是如何创建本地GIT系统的。

根据你的描述,你创建了一个本地仓库,并且想要将其与github.com上的仓库同步?同步两个仓库是一种非传统的做法。

然而,我提供了一个解决方案,可以在github.com上拥有一个仓库(远程主分支指定为origin/master),并在你的系统上拥有一个本地跟踪副本(本地主分支指定为local master branch)。

执行命令git remote show origin来查看输出。它应该如下所示。

HEAD branch: master
   Remote branch:
        master tracked
   Local branch configured for 'git pull':
        master merges with remote master

如果不是这样,那么你可能遵循了其他非传统的方法。

你是否使用 git clone 或者 git init 创建了本地GIT系统???

传统的方式:

  1. Github.com 上的仓库名称 = myrepo
  2. git clone user@github.com/myrepo.git
  3. 上述命令会自动创建一个跟踪远程主分支(即仓库)的本地主分支
  4. 现在你可以在本地GIT系统上执行其他GIT操作,如添加、提交、合并、推送、拉取和非常重要的分支操作。

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接