【发布时间】: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