【问题标题】:Trying to understand Git Branches试图理解 Git 分支
【发布时间】:2016-12-03 13:13:15
【问题描述】:

我是从 Git 开始的,但我并不完全了解分支是如何工作的。 我开始了一个基本项目,我做了以下事情:

  1. 从 'ma​​ster' 本地分支开始,创建 2 个文件:1.txt2.txt。添加这些文件。提交和推送。 => origin/master 现在有这两个文件。
  2. 从 'local/master = head/master' => wip_12_pushed 创建一个正在进行的分支 (wip)(它应该有文件 1 和 2)
  3. 仍在本地 master 中,再创建两个 文件 (3,4)) 但甚至不添加它们。
  4. 从 'local/master' 创建一个分支 => wip_34_not_added(我想这应该仍然只有文件 1,2... 因为 3,4 还没有添加)
  5. 在本地 master 中,再创建两个 文件 (5,6),添加、提交并推送它们
  6. 从 'local/master' 创建分支=> wip_files_56_pushed(因此应该推送文件 1、2、5、6)
  7. 在本地 master 中,再创建两个 文件 (7,8),添加它们,提交它们但不要推送它们
  8. 从 'local/master => wip_78_committed_only 创建本地分支(所以这应该有文件 1,2,5,6(全部推送),不确定 5,6。它们是否应该出现在新分支也提交了吗?)

我必须理解的问题是,当我切换到这些不同的分支时,我真的看不出我的 windows 命令行有什么不同?甚至去我的windows文件夹,所有文件都还在,所以我怎么知道哪个文件属于哪个分支?

更重要的是,我切换到分支 'wip_56_pushed',该分支是在对文件 7 和 8 执行任何操作之前创建的。然后我从该分支执行了 git push --set-upstream origin wip_56_pushed以某种方式处理了文件 7和 8 仅在本地/master 中处于提交状态并且“wip78_committed”也被推送到远程源/master 中?我期待这个 'wip_56_pushed' 分支没有对新文件有什么想法吗?

【问题讨论】:

  • 请提供您发出的确切命令。
  • 我使用的唯一命令git push --set-upstream origin wip_56_pushed。所有其他操作都是在 Windows UI 中使用 TortoiseGit 完成的。基本上,我不知道在哪里可以看到哪些文件属于哪个分支(因为所有文件都在同一个 windows 文件夹中)。而且我不明白为什么当我使用上面的命令推送分支“wip_56_pushed”时,我的 origin/master 也收到了文件 7 和 8(它们已提交但仅在其他分支中)?
  • 啊,我想我现在知道你的问题了。
  • 除了 Vampire 的回答之外,请记住,关于分支名称有很多历史包袱,因此您可以设置或调整 40 多个配置选项,其中大部分您希望避免可能的。保持本地名称foo 与上游origin/foo 匹配,即origin 上另一个Git 上的foo,你会更快乐。
  • 感谢 torek,我今天几乎花了整个时间,但在尝试从一个本地分支合并到远程分支并切换分支时仍然遇到问题)。我会尽量让它尽可能简单,因为在我们的项目中我们不需要任何花哨的东西......

标签: git github git-branch branching-and-merging


【解决方案1】:

git push --set-upstream origin wip_56_pushed 不会将wip_56_pushed 推送到origin/master,而是推送到origin/wip_56_pushed。当您之前将文件 7 和 8 添加到 master 并可能推送它时,它们当然存在于 origin/master 中。如果您想将本地的wip_56_pushed 推送到origin/master,请执行git push --set-upstream origin wip_56_pushed:master

至于哪些文件属于哪些分支,这很简单。如果您已签出分支 X,则所有未跟踪的文件 (git status) 都是您已签出的分支的一部分。

【讨论】:

  • 谢谢,我一直在练习和理解更多一点。还有两个疑问:1-不同分支的本地文件存储在哪里(因为它们可能不同)? 2-我保留了origin/master,并创建了一个新的origin/78_branch(在这个分支中,我推送了两个新文件-7,8)。如果我现在在我的本地/主服务器上,我如何从 origin/78_branch 中提取和合并更改?我正在做git merge origin/78_branch master,我得到了“已经是最新的”(但我没有得到新文件 7,8)。如果我这样做 git pull origin 78_branch 我也已经更新了。分支->FETCH_HEAD。但没有新文件
  • 1.git 内部,Git 非常有效地将文件的所有差异存储在objects 中。这就是 VCS 的意义,如果所有分支的所有文件都同时存在,那就没有太大意义了。 ;-) 2 如果没有命令来重现您的情况或您的回购,很难回答。特别是正如您之前所说,您已经将 7 和 8 添加到 master 中。
  • 1.我明白了,谢谢。 2-在您的第一次解释之后,我从头开始了一个新项目。在这一个中,我刚刚创建了一个 master,添加了一些文件(1 到 4),然后我从那里创建了一个分支,不断在新分支中添加更多文件(5-8),我将所有这些文件推送到一个新的远程分支(78_remote)。现在,我在本地检查了原始主文件(有文件 1-4)。我正在尝试将 origin/78_remote 与 local/master 合并并获取新文件 (5-8) 但我正在执行的命令只是说 local/master 是最新的,因为那里不正确文件是否丢失...
  • 你确定你确实推送了那个分支而不只是提交到本地分支吗?执行git log origin/78-remotegit log 78-remotegit log master。如果您想学习和理解 git,我建议您使用命令行。如果您愿意,您可以稍后使用 GUI。这还有一个好处是您可以发布您在此处执行的命令。 ;-)
  • 是的,文件在服务器上(检查网站):origin/78-remote(文件 1-8),origin/master(仅文件 1-4)。本地/主(仅文件 1-4)。我运行的 git mergegit pull 命令不会从 origin/78-remote 带来文件(我想我没有使用正确的语法?但我想不通)
【解决方案2】:

你是如何从一个分支切换到另一个分支的?你用了很多次push..这时候可能不需要,但没有提到checkout甚至单次,主要用于在分支之间切换..你能分享下面的输出吗

1)git reflog

2) git ls-tree --name-only master

3)git ls-tree --name-only < branch name >(分享每个分支的结果)

【讨论】:

  • 当时我在正确的分支中进行推送。我通过乌龟前端切换它们,但那是在引擎盖下做一个git branch checkout。当我尝试合并时,仍然存在一些分支中缺少的东西的问题,但现在,在我完全理解这一点之前,我不会尝试创建许多分支。
  • 哦..好的,请使用git rev-list remote_name /master ^$(git rev-list master --all) 来获取 2 个远程和本地之间的区别...这总是会导致问题..使用来自git branch -r 的远程分支名称
  • 干杯人,下次我看到奇怪的问题时会记下比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 2018-03-06
  • 2016-11-13
  • 1970-01-01
  • 2012-05-13
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多