【问题标题】:How to maintain multiple independent stable git branches如何维护多个独立稳定的git分支
【发布时间】:2019-04-20 13:15:21
【问题描述】:

这是一个 git 问题。我正在用纯(命令行)Ruby 制作programming study review app。此应用程序允许用户设计和安排对编程任务的审查,管理执行任务的文件,并从应用程序自动运行结果。出于这些目的,当只有一个文件时,我不需要 git。但大多数高级和网络编程任务都涉及编辑和使用多个文件,并且要管理它,I need to use git,我不擅长 git。

在应用程序中,这些更复杂的“repotasks”的创建者预计会根据(他选择的)repo 的 git 分支(他选择的)提出问题。所以我认为这需要的是,对于每个repo,都有一系列的分支,每个分支都相互独立维护,并且每个分支都相对稳定;该应用程序基本上会根据需要检查分支以回答问题。 听起来很简单...

问题是:

  • 在我创建新分支(手动,使用git checkout -b branch_name)并添加新文件后,我似乎无法签出一些以前的分支。例如:

    $ git checkout foobar_JS_enabled_missing_prompt error: The following untracked working tree files would be overwritten by checkout: display_nodename.html Please move or remove them before you switch branches. Aborting

  • 在用户回答完问题后,我(我想我)需要git reset --hard 分支。但是这样做似乎无意中使我在建立以后的分支时努力工作的文件空白。我认为这是因为我硬重置了一个较早的分支,其中所述文件为空白。

到目前为止,应用程序所做的 git 交互(主要使用ruby-git)是:

  • 实际上是手动创建存储库和分支。
  • 列出可供提问者选择的分支。
  • 在选择分支时结帐,使用

    g = Git.open("data/repos/#{repo}") g.branch(branch).checkout

  • 当用户开始回答问题时,对问题所基于的分支进行硬重置,使用:

    g = Git.open("data/repos/#{repo}") g.reset_hard

  • 我还没有这样做,但我想为每个问题创建一个存档分支,即我想让问答者查看旧答案,然后切换到主分支问题以创建新答案。

基本上,我想要每个分支的冻结版本,但该过程(如上所述)似乎会产生不必要的交互。我认为分支是自动相互隔离的。我究竟做错了什么?我需要做什么才能冻结每个分支的最后提交版本,而不管其他分支发生了什么,而我在分支之间频繁切换?

更新(11/18):我将把它作为评论而不是答案,因为这个问题有点模糊。我从来没有意识到索引和树是独立于分支的。所以我的代码实际上有一些微妙的错误,这些错误与我让我的树变得不干净有关。在一些地方,我需要在让回答者开始处理答案之前硬重置代码,即使在大多数情况下,这不是必需的。我还需要在应答器完成后硬重置代码。我需要做的另一件事是检查当前签出的分支并切换到正确的分支(我已经这样做了,但不是在我应该做的所有地方)。

现在似乎可以正常工作了,我无法再复制这些错误了。

【问题讨论】:

  • 索引和工作目录不属于任何分支。当您切换分支时,Git 会尝试保留未提交的更改。如果它不能这样做,那么它会拒绝结帐。您需要提交更改才能使它们属于分支。
  • 我其实不知道。我以为每个分支都有自己的索引,如果你切换回来,你就会切换回旧索引,或者其他什么……先生,这将有很大帮助!我想我现在也许能弄明白了。
  • 那么,为了清楚起见,返回具有不同文件的先前分支的完整过程是什么?我只是提交更改然后检查吗?文件和目录的旧状态将在我的文件系统中重新加载...?我实际上认为这就是它的工作方式,并希望它是这样工作的......我认为我看到了它工作的证据......但现在我只是感到困惑。
  • 据我了解,当您从source 结帐到destination 时,会检查每个文件:如果source 匹配destination,则保留索引和工作目录(初始结帐情况除外)。否则,如果索引匹配destination,则保留索引和工作目录。否则,如果索引匹配source 并且工作目录匹配索引,则更新索引和工作目录以匹配destination。否则,失败。

标签: ruby git version-control git-reset


【解决方案1】:

您可以在切换分支之前将您的工作保存在 stash 中。 Read here .
在切换到其他分支之前,请使用git stash
当你再次回到这个分支时,你可以通过git stash pop加载你保存在stash中的工作。
"pop" 会在申请后删除你的 stash,你也可以为你的 stash 命名,以及做一些其他的事情,比如在申请后不删除一个 stash。

【讨论】:

  • 看起来很有用。
【解决方案2】:

除了恢复旧版本,或者如果你犯了错误,git reset hard 必须非常非常罕见。 git reset 唯一真正的用途是当你不想保存你的工作时。

在分支之间的每一次移动中,您必须先 git commit 和 git push(即发送到服务器)才能离开,并且在 git checkout 之后您必须 git pull(即从服务器获取)。

如果你不这样做,你就会像你所说的那样得到错误。

冻结分支和没有交互对于 git 来说是无稽之谈。不“互动”的唯一方法是正确完成您的工作(提交、推送)并正确获得同事的工作(拉动)。

【讨论】:

  • 您应该更仔细地阅读问题并理解上下文。确实,我这样做了git reset --hard,因为我不希望永久保存用户的工作。我使用 git 的目的可能不是最初的打算,但我认为它可以工作。
  • "我需要做什么才能冻结每个分支的最后提交版本,而不管其他分支发生了什么,而我在分支之间频繁切换?" -> 将* 放入.gitignore 中? (即忽略每个文件)。如果我了解您对学生的特殊用途 git。这只在上课期间。
  • 我在回答中说的和 PetSerAl 一样的话,你有 -1。
  • 抱歉,我不这么认为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2015-06-01
  • 1970-01-01
  • 2015-01-22
  • 2020-05-19
  • 1970-01-01
  • 2021-03-29
相关资源
最近更新 更多