这是一个git问题。我正在用纯(命令行)Ruby制作programming study review app。该应用程序使用户可以设计和安排对编程任务的审阅,管理执行任务的文件以及从该应用程序自动运行结果。为此,当只有一个文件时,我不需要git。但是大多数高级和Web编程任务都涉及编辑和使用多个文件,并I need to use git来对其进行管理,而我对git并不满意。
在应用程序中,这些更复杂的“回购任务”的制造商应根据回购(自己选择)的git分支(自己选择)来提出问题。因此,我认为这是需要的,对于每个回购,都有一系列分支,每个分支彼此独立维护,并且每个分支相对稳定。该应用程序基本上会根据需要签出分支机构来回答问题。听起来很简单
问题是:
创建新分支(用手,用git checkout -b branch_name
)并添加新文件后,似乎无法检出 some 先前的分支。例如:
$ 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
I(认为I)需要在用户完成回答问题后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):我将其留为评论而不是答案,因为问题有点晦涩。我从未意识到索引和树是独立于分支的。因此,我的代码实际上存在一些细微的错误,这些错误与我让我的树变得不干净的事实有关。在很多地方,即使在大多数情况下,这不是必需的,在让答题人开始对答案进行操作之前,我需要对代码进行硬重置。回答者完成后,我还需要硬重置代码。我需要做的另一件事是检查当前已检出哪个分支,然后切换到正确的分支(我已经做过,但并非应该在所有地方执行)。
似乎现在可以正常工作,而且我无法再复制这些错误。
答案 0 :(得分:0)
您可以在切换分支之前将工作保存在存储中。 Read here。
在切换到其他分支之前,请使用git stash
。
当您再次回到该分支时,可以加载git stash pop
保存在存储中的工作。
“ pop”会在应用后删除您的存储,您也可以命名存储,并进行其他操作,例如在应用后不删除存储。
答案 1 :(得分:-1)
除了还原旧版本,或者如果您犯了一个错误,硬git reset必须非常罕见。 git reset的唯一真正用途是在您不想保存工作时。
在分支之间的每一次移动之前,您都必须先进行git commit和git push(即发送到服务器),然后在git checkout之后必须进行git pull(即从服务器获取)。
如果您不这样做,就会像谈论它那样收到错误消息。
冻结分支并且没有交互对于git来说是无稽之谈。不进行“交互”的唯一方法是正确完成您的工作(提交,推送),并正确进行同事的工作(拉动)。