使用git-tfs fetch获取最新信息会导致合并冲突

时间:2013-04-23 01:14:52

标签: git-tfs

我在尝试从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
  4. 此时我的BitBukcet repo拥有来自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是最新的代码,它也试图将我的“master”中的更改合并到我的“NewBranch”中。 ptfs pull命令将最后一个checgeset拉下来,但随后尝试进行合并。如果我使用

    git tfs fetch --all
    

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

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

    由于

    EDIT 我正在尝试从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
    

3 个答案:

答案 0 :(得分:2)

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

我似乎需要进行提取

git tfs fetch --all

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

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调用和传递给它的参数。

干杯

答案 1 :(得分:0)

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

  • 使用TFS分支 我看到你创建了一个分支(步骤2)并在该分支中提交。 当您检查了您的分支“NewBranchName”时,您应该使用以下命令进行检查:

    git tfs rcheckin -i NewBranchName

并通过以下方式进行修改

git tfs pull -i NewBranchName

或(使用rebase)

git tfs pull -r -i NewBranchName

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

  • 检查您对TFS的提交 我给你上面的命令来检查你的提交。但是你应该知道,出于某些原因,当你在TFS中签入git提交时,会创建一个TFS中的新变更集(这就是我们想要的;))并在创建新的git commit之后。它与原始文件几乎相同但有一些信息(你可以在git注释中看到)。 由于这个事实,取决于你做了什么(我并不完全明白是什么),你可能会遇到问题,因为git尝试在同一个地方合并提交完全相同的修改,因此无法自动合并。

事实上,我认为您的工作流程存在问题,因为您不应该遇到此问题。尝试在工作流程中找到问题。

我希望它会有所帮助。

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

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

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

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

=&GT;在你的主分支中:

//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

=&GT;在你的'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告诉你?

答案 2 :(得分:0)

git tfs fetch 命令不会更新您的本地git存储库,这就是您之后应该执行 git merge 的原因。

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

git tfs pull -r

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

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

git push -u origin --all