如何在没有额外提交的情况下确保我的本地分支跟踪远程相同?

时间:2015-02-10 23:41:09

标签: git github branch tracking

$ cd my/repo
$ git checkout develop
$ git fetch origin
$ git checkout -b branch origin/branch
$ git pull origin HEAD
CONFLICT (content): Merge conflict in folder/file.ext
Auto-merging folder/file.ext
Automatic merge failed; fix conflicts and then commit the result.

我真的很困惑为什么我的分支机构还没有更新。我以为git fetch用来自原点的delta信息抓取所有远程分支。

即使回去开发,删除分支并重复这些步骤,问题也会重复出现。我究竟做错了什么?我只想确保 - 甚至在我做完之后

$ git checkout --theirs folder/file.ext

git status显示文件夹/ file.ext已被修改,并希望我提交更改。我不明白为什么要做出改变。我只是想要原点/分支,就像它在本地的原点一样,在一个名为相同的跟踪分支中。

这是如何实现的?

2 个答案:

答案 0 :(得分:0)

如果要确保同名的远程和本地分支相同,则需要从远程获取最新的更改(如果有)或将本地的最新提交(如果有)推送到远程。要做到这一点,您需要在pull命令中指定分支名称,而不是使用HEAD git pull origin branch_name

如果要确保在提取远程分支中可用的最新代码时没有额外提交,则应该修复将远程分支拉到本地分支后可能发生的冲突。您可以使用git diff命令执行此操作。但是,Git可以更轻松地解决冲突,但如果你特别没有额外的提交,那么你可以修复冲突的行然后拉。

“我认为git fetch使用来自原点的delta信息抓取所有远程分支” - 是的,你是对的,但它在获取信息时停止,除非你做{{1或git merge(= git pull + git fetch)。

答案 1 :(得分:0)

我想我想出了我想要的东西。首先,检查git log或浏览到Github上的远程branch_name并找到分支中的最新提交,说abc123...是散列。

$ git co master
$ git fetch
$ git pull origin master
$ # remove local branch if you have one, losing changes if any!
$ git branch -D branch_name
$ git checkout abc123
Note: checking out 'abc123...'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

git checkout -b new_branch_name

HEAD is now at abc123... commit message here

$ git checkout -b branch_name
$ git branch --set-upstream-to=origin/branch_name
Branch branch_name set up to track remote branch branch_name from origin by rebasing
$ git pull origin/branch_name

我现在有一个本地branch_name跟踪origin / branch_name在确切的时间点(完全相同的提交哈希)作为origin / branch_name而没有diff / merge / rebase并且没有额外的合并提交被按下顺序推送到我的远程仓库继续。