【发布时间】:2016-10-14 09:22:42
【问题描述】:
我已经做了很多阅读,但仍然不太清楚如何在不同地方的 git 分支上工作。怎么做?
首先,我必须在分支机构工作的原因是我确实有一个“上游”存储库,我需要不时将其重新设置为我的master。所以为了让我的插件从上游保持干净,我需要在一个 git 分支上工作。
更新 2:
好的。这比我现在想的要复杂得多。我从源位置做的方式是,git checkout -b newfeature 然后用git push -u origin newfeature 推送,这是在“上游”存储库以及我自己的master 存储库之上完成的,按照以下方向设置
问题是我想在这样的 git 分支上工作,就像在普通 git 中工作一样——即,当我执行某种git push 时,我希望从另一个执行某种git pull位置以获取最新更新。
当我从第二名开始做git pull 时,我得到了Already up-to-date。即,我想要处理的远程分支对我不可用。
PS。我发现的信息,来自 http://longair.net/blog/2009/04/16/git-fetch-and-merge/
如果你想基于远程跟踪分支创建一个本地分支(即为了实际工作),你可以使用 git branch –track 或 git checkout –track -b 来实现,这很相似,但它还将您的工作树切换到新创建的本地分支。例如,如果您在 git branch -r 中看到您想要一个名为 origin/refactored 的远程跟踪分支,您可以使用以下命令:
git checkout --track -b refactored origin/refactored
但是,这是我从源位置的git branch -r 得到的。
$ git branch -r
origin/HEAD -> origin/master
origin/master
也就是说,没有名为 origin/something 的远程跟踪分支,但我显然在一个分支中工作:
$ git status .
On branch newfeature
nothing to commit, working directory clean
$ git branch -vv
master 55e1d6f [origin/master] Remove ...
* newfeature 8c4266a - [+] add ...
由于-r 表示远程跟踪分支,我也从第二位获得了git branch -r 相同的结果。
更新 3:
最后,我可以确认问题出在我的源端,即没有列出远程跟踪分支。再次将它们并排列出。
首先,我目前的错误来源:
$ git branch -r
origin/HEAD -> origin/master
origin/master
$ git branch -vv
master 55e1d6f [origin/master] Remove ...
* newfeature 8c4266a - [+] add ...
第二,应该是什么:
$ git branch -r
origin/HEAD -> origin/master
origin/master
origin/newfeature
$ git branch -vv
master 7b1fc0f [origin/master] Add readme
* newfeature 7b1fc0f [origin/newfeature] Add readme
^^^^^^^^^^^^^^^^^^^
git config --get-all remote.origin.fetch 的输出在两个站点上是相同的,+refs/heads/master:refs/remotes/origin/master:
$ git config --get-all remote.origin.fetch
+refs/heads/master:refs/remotes/origin/master
最终更新:
感谢@torek 的不懈帮助,我终于把事情弄清楚了。以下是按照@torek 的指示修复.git/config 文件之后的最后步骤:
git checkout master
# then fix the `.git/config` file
git config --edit
$ git branch -vv
* master 55e1d6f [origin/master] Remove ...
newfeature 8c4266a [origin/newfeature: gone] - [+] add ...
^^^^
$ git branch -r
origin/HEAD -> origin/master
origin/master
upstream/master
# The "origin/newfeature" is missing
$ git checkout newfeature
Switched to branch 'newfeature'
Your branch is based on 'origin/newfeature', but the upstream is gone.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(use "git branch --unset-upstream" to fixup)
$ git branch --set-upstream-to origin/newfeature
error: the requested upstream branch 'origin/newfeature' does not exist
hint:
hint: If you are planning on basing your work on an upstream
hint: branch that already exists at the remote, you may need to
hint: run "git fetch" to retrieve it.
hint:
hint: If you are planning to push out a new local branch that
hint: will track its remote counterpart, you may want to use
hint: "git push -u" to set the upstream config as you push.
$ git push -u origin newfeature
Branch newfeature set up to track remote branch newfeature from origin.
Everything up-to-date
$ git branch -r
origin/HEAD -> origin/master
origin/master
origin/newfeature
upstream/master
# The "origin/newfeature" is now listed
$ git branch -vv
master 55e1d6f [origin/master] Remove ...
* newfeature 8c4266a [origin/newfeature] - [+] add ...
# Horay!!!
所以回顾一下,首先要让事情正确,请按照http://www.gitguys.com/topics/adding-and-removing-remote-branches 中的说明进行操作。通过那个小演示,我能够获得正确的结果。即,我一直遵循的方向
可能是也可能不是原因。但是,如果您遇到类似情况,现在我们有办法解决它。
最终更新结束
那么,让我问最后一个问题——是否可以纠正我的错误来源?
根据
checkout tracked remote branch,我认为问题出在我的源端,即,我没有在跟踪的远程分支部分中看到我的分支。这是我的:
$ git remote show origin
* remote origin
Fetch URL: git@github.com:me/myproj.git
Push URL: git@github.com:me/myproj.git
HEAD branch: master
Remote branch:
master tracked
Local branches configured for 'git pull':
master merges with remote master
newfeature merges with remote newfeature
Local refs configured for 'git push':
master pushes to master (up to date)
newfeature pushes to newfeature (up to date)
当我从第二个位置执行git remote show origin 时,我没有看到那里列出的新功能。
更新:
我在第二位看到git ls-remote 中的newfeature:
$ git ls-remote
From git@github.com:me/myproj.git
55e1d6fd9048336c7f0b178fbbf78231ca28ff06 HEAD
55e1d6fd9048336c7f0b178fbbf78231ca28ff06 refs/heads/master
8c4266a6a98f498c129a2a9e806e00e6c6d196b1 refs/heads/newfeature
8c4266a6a98f498c129a2a9e806e00e6c6d196b1 refs/tags/v1
但是,我不知道如何从我的第二个地方使用它:
$ git checkout --track -b newfeature
Branch newfeature set up to track local branch master.
Switched to a new branch 'newfeature'
而git log 没有显示我已发布到 github 的提交。
也许我不应该使用-b?好吧,我必须:
$ git checkout --track newfeature
fatal: Missing branch name; try -b
$ git checkout newfeature
error: pathspec 'newfeature' did not match any file(s) known to git.
【问题讨论】:
-
你所说的地方是什么意思?我看到了两种明显的可能性。也许您希望在您的笔记本电脑或其他任何设备上拥有两个不同的工作树。或者,也许您有时会随身携带一台笔记本电脑并想在分支
newfeature上工作,但在其他时候您在工作而不使用笔记本电脑并想继续在newfeature上工作。 -
@torek,是的,你的第二种情况正是我的情况。
-
简短回答,发布上次编辑:
git fetch应该在您的本地仓库中创建或更新远程跟踪分支,从 GitHub 上的仓库中的分支获得。然后它将显示在git branch -r输出中,然后您可以git checkout newfeature基于远程跟踪分支创建本地分支,自动设置新本地分支的上游;或者,如果您已经拥有newfeature,您可以通过git checkout newfeature获取onto 它,然后git branch --set-upstream-to origin/newfeature将远程跟踪分支设置为其上游。 -
嗯,没有
newfeature远程跟踪分支 (git branch -r) 即使在git fetch或git fetch origin之后列出,即使git ls-remote表明他们(github)有吗?这意味着remote.origin.fetch行丢失或损坏。通常origin将此设置为+refs/heads/*:refs/remotes/origin/*,但如果它错误或缺失,则可以解释问题。如果您使用git remote add创建origin遥控器,可能会出现这种情况。
标签: linux git github version-control