0

我正在使用GitRails 项目。

今天我做了很多更改,但我忘了移动到 another branch,所以所有这些更改都在 master 分支中但尚未提交

这是我执行git status命令时得到的:

# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   app/controllers/sessions_controller.rb
#   modified:   app/controllers/users_controller.rb
#   modified:   app/helpers/sessions_helper.rb
#   modified:   app/models/user.rb
# .....

#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   app/assets/javascripts/password_resets.js.coffee
#   app/assets/stylesheets/password_resets.css.scss
#   app/controllers/password_resets_controller.rb
# .....
# ......
no changes added to commit (use "git add" and/or "git commit -a")

我如何解决这个错误并将所有这些未跟踪的文件从master移动 到另一个已经存在的分支?谢谢你。

4

3 回答 3

3

只需创建一个新分支然后提交,例如:

git checkout -b my_branch
git commit -am "My commit."
于 2013-08-10T22:19:42.543 回答
0

您只需要创建新分支。

创建分支后,所有更改都将在新分支中。

然后从主人那里清理你的旧东西

// Checkout new branch
git checkout -b my_branch

// Prepare files for commit
git add .

// Commit changes
git commit -m "Your commit message"

// delete the dirty master
git branch -D master

// Now we are going to clean your changes from the master branch
// the -f is important in case you skipped the previous command to delete your master
git checkout -f master 
于 2013-08-10T22:47:54.690 回答
0

如果下面没有标记为 C1、C2 等的提交

你是在简单的情况下;只需使用Henrik N 的答案

如果有跟踪分支

您更新的问题/评论表明您既有已提交的更改,也有未提交的更改,并且您在某个跟踪分支(例如master该轨道origin/masterdevel该轨道)上完成了所有这些更改origin/devel,但您尚未推送其中任何一个。(我假设master,但您可以将每个更改master为下面的功能/开发/任何分支名称。)

如图所示,您的 repo 的提交树和工作目录/索引现在看起来像这样:

M1 -...- M5 -- M6                    <-- origin/master
                 \
                  C1 -- C2           <-- master, HEAD=master
                          \
                           i, w      <-- "index" and working-tree files

i是索引中的内容(git add dir/file1git rm file2等),git status显示为changes to be committed,并且w是您的工作目录中git status显示为的内容changes not staged for commit

这是您希望它看起来的样子:

M1 -...- M5 -- M6                    <-- master, origin/master
                 \
                  C1 -- C2           <-- my_branch, HEAD=my_branch
                          \
                           i, w      <-- "index" and working-tree files

请记住,分支标签就像便笺(“黄色便笺”或“Post-It® 便笺”或其他任何东西):它们上面写有名称并粘贴到提交上。所以你要做的是添加一个新的便笺,my_branch指向提交 C2,并HEAD引用新的分支名称:

git checkout -b my_branch

这使用先前的值HEAD来命名my_branch粘贴到的提交。由于该提交是C2您现在拥有两者mastermy_branch此处。然后它重写HEAD以指向 name my_branch。现在你有:

M1 -...- M5 -- M6                    <-- origin/master
                 \
                  C1 -- C2           <-- master, my_branch, HEAD=my_branch
                          \
                           i, w      <-- "index" and working-tree files

现在您需要将标记的便签移动master到指向的位置origin/master。有两种方法可以做到这一点,使用git reset或使用git branch。使用git reset更难,所以让我们用git branch

git branch -f master origin/master

( -fforce) 标志告诉git branch更改现有的便笺,而不是因为它存在而失败,并origin/master给出master应该指向的提交:所以 git 剥离标签C2并将其粘贴在 上M6,你就有了你想要的设置(第二张图)。


摘要:这只是两个命令:

git checkout -b my_branch           # create new branch and change HEAD
git branch -f master origin/master  # restore master to origin/master

您现在可以像往常一样在 branch 上签入更改my_branch。(git add, git rmgit commit根据需要。)这将添加一个新的提交 C3:

M1 -...- M5 -- M6                    <-- master, origin/master
                 \
                  C1 -- C2 -- C3     <-- my_branch, HEAD=my_branch

如果没有跟踪分支怎么办?

好吧,没关系,只是有点难。回到“现在拥有”和“想要”的图表。在这些图中,我标记的提交M6是您要master命名的提交。你现在必须找到M6。提交具有这些长的十六进制数字 (SHA-1) “真实名称”,它们永远不会改变,例如 5e013711f5d6eb3f643ef562d49a131852aa4aa1。(git rev-parse HEAD将显示当前的“真实名称”,即,HEAD提交。)您可以找到“真实名称”,或者您可以找到一些替代名称或缩写名称,它们也命名相同的东西。

名称有很多选择,但让我们坚持使用来自git logand的数字git log --oneline。后者给你这样的东西:

97206f5 peerish: set socket options earlier
4881af5 add semtest.c
b3f8bea fdm: repair example

其中数字是缩写的 SHA-1,文本是提交消息的第一行。由于日志以相反的顺序显示,所以第一行是最近的提交(C2在上面的示例中),然后下一行是下一个(嗯,合并更复杂,但足够接近)。

假设从上面你可以立即看出我标记的提交M6b3f8bea,即你需要跳过两次提交。只需将该值作为最后一个参数提供给git branch

git branch -f master b3f8bea

如果您的 repo 又大又旧,或者有很多合并提交,您可能希望您的日志包含更多“装饰”。我从很久以前的某个地方得到了这些别名:

[alias]
    lol = git log --graph --decorate --oneline
    lola = git log --graph --decorate --oneline --all

这样我就可以运行git lol并且git lola.

或者,如果您确定确实有两个提交,master~2(在这种情况下,在添加my_branch,之后my_branch~2)将为您提供相同的 SHA-1。该git rev-parse命令向您准确显示任何给定名称“意味着”哪个 SHA-1。在我在这里的一个仓库中,HEAD~2与以下内容相同origin/featureX

$ git rev-parse HEAD~2
0f5a13497dd3da8aff8e452c8f56630f83253e79
$ git rev-parse origin/featureX
0f5a13497dd3da8aff8e452c8f56630f83253e79

但通常git log(或git lol等)将为您提供原始 SHA-1,您可以根据需要从那里添加标签。

于 2013-08-10T23:42:05.207 回答