【问题标题】:Using git-tfs fetch to get latest causes a merge conflict使用 git-tfs fetch 获取最新会导致合并冲突
【发布时间】:2013-04-16 01:46:17
【问题描述】:

我在尝试从 TFS 中提取我的最新更改并将它们添加到 BitBucket 存储库时遇到问题。我已成功将分支推送到 BitBucket,但是当我尝试从 TFS 获取任何新签入时,我总是遇到合并冲突。

步骤:

  1. git tfs clone http://TFS-ADDRESS/Collection $/Project/Name/Branch
  2. git tfs init-branch $/Project/Name/NewBranch NewBranchName
  3. git push -u origin --all

此时,我的 BitBukcet 存储库包含了我所有来自 TFS 的文件和历史记录。 然后我在 TFS 上检查了我的 $/Project/Name/NewBranch。

现在我想从 TFS 获取最新的变更集并将它们添加/提交到 BitBucket 存储库 注意:此时,TFS 或 BitBucket 中的其他分支没有更改。唯一的变化是我单次签入 TFS

当我在我的 NewBranch 上执行以下操作时,我遇到了合并冲突:

git tfs pull

Auto-merging Source/build.version
CONFLICT (content): Merge conflict in Source/build.version

据我所知,它正在尝试将更改从我的“主”合并到我的“NewBranch”,即使 NewBranch 是最新的代码。 ptfs pull 命令正在拉下最后一个检查集,但随后尝试进行合并。如果我使用

git tfs fetch --all

我看到列出的变更集,但我无法将其提交/推送到 BitBucket 存储库。我在网上找不到参考资料来说明我做错了什么,或者我需要采取哪些步骤(我是 Git 新手)。有人可以帮忙吗?

我最终希望自动执行此操作,以便可以获取 TFS 中的任何签入并将其添加到 BitBucket 存储库(直到我们最终将所有开发人员移至 BitBucket)

谢谢

编辑 我正在尝试将更改从 TFS 更改为 BitBucket。 BitBucket 没有向 TFS 添加任何内容。

所有工作都在一个分支上完成(见下文)。用户正在 TFS 中工作。用户在那里提交他们的更改。注意:没有人对 BitBucket 存储库进行编辑。它是 TFS 的副本。 每天一次,我想将每个 TFS 分支的最新变更集拉到我的本地 git 文件夹,然后将它们推送到 BitBucket。 “git tfs fetch”检索变更集:

D:\development\workspaces\git\anothertry>git tfs fetch --all
C83419 = 3abdaedf571369dce15f74a52697d86069f87d6d

但是“git status”告诉我没有什么可以提交的

D:\development\workspaces\git\anothertry>git status
# On branch Feature
nothing to commit, working directory clean

当我尝试将此变更集推送到 BitBucket 中时,git 告诉我没有什么可提交的。

分支机构

Master---o---------------o----o--o-o--o-------
          \             /    /  / /  /
           Feature-----o----o--o-o--o

【问题讨论】:

    标签: git-tfs


    【解决方案1】:

    使用 Git Extensions 后,我似乎找到了答案。

    看来我需要取回

    git tfs fetch --all
    

    这将为我的主干和我已映射的任何分支 (init-branch) 从 TFS 获取所有变更集

    D:\development\workspaces\git\anothertry>git tfs fetch --all
    C83454 = f65ba8d0cc7b40f42148ba2c06d0da8b7e968c4d
    C83455 = 6c25feb6e74a09d0d3d84344002e7546044900ab
    C83459 = 91c4450d702d5a97e862aedd7ad1b5af3ff2c375
    C83460 = 5cacaba5bfe4197c1bf9fab498f51c1ba435e6ea
    

    接下来我需要执行合并

    git merge <guid>
    

    注意:这是最新的变更集(在本例中为 5cacaba...)

    Updating 6c25feb..5cacaba
    Fast-forward
     Source/Common/w32threads.h             | 1238 ++---
     Source/xxxxxxx_Service/ServerAgent.cpp | 3638 ++++++-------
     Source/xxxxxxx_Service/ServerAgent.h   |  449 +-
     Source/xxxxxxx_Service/User.cpp        | 9073 ++++++++++++++++----------------
     Source/xxxxxxx_Service/User.h          |  647 +--
     Source/build.version                   |    2 +-
     6 files changed, 7562 insertions(+), 7485 deletions(-)
    

    最后,将我的更改推送到 BitBucket

    git push --all
    

    所以,我似乎错过了 git merge 调用和传递给它的参数。

    干杯

    【讨论】:

    • fetch --all 有点矫枉过正(查看所有远程 tfs 以获取更改,并且由于 TFS,需要时间)并且您的合并仅在您位于良好分支中时才有效,否则您将拥有一些东西不要指望!所以“git tfs pull -r -i NewBranchName”会更好。然后推送到 bitbucket... PS : "pull" = "fetch" + "merge"
    【解决方案2】:

    我不完全理解你做错了什么,但你现在应该在使用 git-tfs 时做一些事情......

    • 使用 TFS 分支 我看到您创建了一个分支(步骤 2)并在该分支中提交。 签出分支“NewBranchName”后,您应该使用以下命令签入:

      git tfs rcheckin -i NewBranchName

    并使用 :

    拉取修改
    git tfs pull -i NewBranchName
    

    或(使用变基)

    git tfs pull -r -i NewBranchName
    

    如果您没有使用 TFS 远程名称指定 -i 选项,您将在主分支(此处为 $/Project/Name/Branch )中签入您的提交:(

    • 在 TFS 上检查您的提交 我给你上面的命令来检查你的提交。但是您应该知道,由于某些原因,当您在 TFS 中签入 git 提交时,会在 TFS 中创建一个新的变更集(这就是我们想要的;))并且在创建新的 git 提交之后。它与原始版本几乎相同,但包含一些信息(您可以在 git 评论中看到)。 由于这个事实,根据你所做的事情(我不完全理解是什么),你可能会遇到问题,因为 git 尝试在同一个地方合并提交与完全相同的修改,所以无法自动合并。

    事实上,我认为你的工作流程有问题,因为你不应该遇到这个问题。尝试找出工作流程中的问题。

    我希望它会有所帮助。

    随意查看 git-tfs wiki:https://github.com/git-tfs/git-tfs/wiki 我希望有非常有用的信息(部分做到了,充满爱;))

    PS:为了更好地帮助你,你能告诉我你使用哪个命令来检查你的提交吗? 签入,签入,重新签入?强烈建议 rcheckin!

    我如何使您的工作流程自动化:

    (这里的“bitbucket”是您的远程 bitbucket 存储库的假定名称)

    => 在您的主分支中:

    //Do your job & commit with git & ...
    //rebase your work on TFS work
    git tfs pull -r
    //rcheckin with git-tfs
    git tfs rcheckin
    //commit in bitbucket repo
    git push bitbucket master
    

    => 在您的“NewBranchName”分支中:

    //Do your job & commit with git & ...
    //rebase your work on TFS work
    git tfs pull -r -i NewBranchName
    //rcheckin with git-tfs
    git tfs rcheckin -i NewBranchName
    //commit in bitbucket repo
    git push bitbucket NewBranchName
    

    PS2:也许,如果您在执行 pull -r 和 rcheckin 之前在您的工作目录中有未提交的更改,您应该隐藏您的修改...

    编辑:你编辑,我编辑;)

    之前,我假设您已经为您的 bitbucket 存储库定义了一个远程:

    git remote add bitbucket https://bitbucket.org/yout_login/your_project.git
    

    你只需要:

    //checkout your branch
    git checkout NewBranchName
    //fetch the TFS changesets and merge your branch into
    git tfs pull -r -i NewBranchName
    //push your commit on bitbucket
    git push bitbucket NewBranchName
    

    并解释一下您在做什么(并且完全不理解:()...

    使用“git tfs fetch --all”,您将获取所有分支的 TFS 变更集,但不会与您的本地分支合并(或变基)。因此它们不会出现在您的本地分支中。 您可以通过命令查看 DAG 以更好地理解:

    git log --oneline --graph --decorate
    

    上面给出的“git tfs pull”将获取的提交与你的分支合并,这样会很好!

    “git status”告诉我没有什么要提交的

    此命令显示在工作目录中修改的文件。所以,你看不到任何变化是正常的。这确实表明您的提交没有被取消!

    当我尝试将此变更集推送到 BitBucket 中时,git 告诉我没有什么可以提交。

    你应该有!您确定已将远程定义到您的 bitbucket 存储库吗? (往上看) 您使用哪个命令? git 告诉你什么?

    【讨论】:

    • 感谢@Philippe 的回复。
    • 我想我没有描述我的问题。我已经用更多信息编辑了我的问题。基本上,我试图在 BitBucket 中复制 TFS 存储库。我不想将 BitBucket 中的任何内容添加到 TFS 中
    • 查看我的编辑。我更了解您的工作流程(但不是您的所有问题 :( )。希望它会有所帮助!
    【解决方案3】:

    git tfs fetch 命令不会更新您的本地 git 存储库,因此您应该在此之后执行 git merge

    要在一个命令中执行相同操作,只需从 TFS 遥控器中拉取

    git tfs pull -r
    

    这应该使用来自 TFS 服务器的所有新更新来更新本地 git 存储库

    此时你只需要将更新推送到 git 服务器:

    git push -u origin --all
    

    【讨论】:

      猜你喜欢
      • 2015-08-23
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 2011-08-20
      • 1970-01-01
      • 2020-08-13
      相关资源
      最近更新 更多