忘了用Git转移到另一个分支而不是主人

时间:2013-08-10 22:17:25

标签: ruby-on-rails git

我正在使用带有rails项目的Git

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

这是我在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")

我如何解决此错误并将所有这些未跟踪文件从 移至另一个分支已存在?谢谢。

3 个答案:

答案 0 :(得分:3)

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

git checkout -b my_branch
git commit -am "My commit."

答案 1 :(得分: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 

答案 2 :(得分:0)

如果

下面没有标记为C1,C2等的提交

你是在简单的情况下;只需使用Henrik N's answer

如果有跟踪分支

您更新的问题/评论表明您已经提交了更改和未提交的更改,并且您在某些跟踪分支上执行了所有更改,例如跟踪masterorigin/master的{​​{1}}跟踪devel,但你尚未推送其中任何一个。 (我假设origin/devel但您可以将每个master更改为功能/开发/下面的任何分支名称。)

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

master

此处M1 -...- M5 -- M6 <-- origin/master \ C1 -- C2 <-- master, HEAD=master \ i, w <-- "index" and working-tree files 是索引中的内容(igit add dir/file1等),git rm file2显示为git statuschanges to be committedw显示为git status的工作目录中的内容。

以下是您想要的样子:

changes not staged for commit

请记住,分支标签就像粘滞便笺(“黄色胶粘物”或“Post-It®注释”或其他):它们上面写有名称并粘贴到提交中。所以你需要做的是添加一个新的粘滞便笺,M1 -...- M5 -- M6 <-- master, origin/master \ C1 -- C2 <-- my_branch, HEAD=my_branch \ i, w <-- "index" and working-tree files ,指向提交C2,并使my_branch引用新的分支名称:

HEAD

这使用先前的git checkout -b my_branch 值来命名粘贴HEAD的提交。由于该提交为my_branch,因此您现在同时拥有C2master。然后,它会重写my_branch以指向名称HEAD。现在你有:

my_branch

现在,您需要移动标有M1 -...- M5 -- M6 <-- origin/master \ C1 -- C2 <-- master, my_branch, HEAD=my_branch \ i, w <-- "index" and working-tree files 的便条,指向master点所在的位置。有两种方法可以执行此操作,origin/mastergit reset。使用git branch会更难,所以让我们使用git reset

git branch

git branch -f master origin/master (强制)标记告诉-f更改现有的便签,而不是因为它存在而失败,而git branch会提供哪个提交origin/master -to:所以git将标签剥离master并粘贴在C2上,然后你就可以进行设置(第二张图)。


总结:这只是两个命令:

M6

您现在可以像往常一样在分支git checkout -b my_branch # create new branch and change HEAD git branch -f master origin/master # restore master to origin/master 上检查更改。 (my_branchgit addgit rm根据需要。)这将添加新的提交C3:

git commit

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

嗯,没关系,这有点困难。回到“有现在”和“想要”的图表。在这些图中,我标记为M1 -...- M5 -- M6 <-- master, origin/master \ C1 -- C2 -- C3 <-- my_branch, HEAD=my_branch 的提交是您想要M6命名的提交。你现在必须找到 M6。提交具有永远不会改变的长十六进制数字(SHA-1)“真实名称”,例如5e013711f5d6eb3f643ef562d49a131852aa4aa1。 (master将显示当前的“真实姓名”,即git rev-parse HEAD,提交。)您可以找到“真实姓名”,或者您可以找到一些替代名称或缩写名称同样的事情。

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

git log --oneline

其中数字是缩写的SHA-1,文本是提交消息的第一行。由于日志以相反的顺序显示,因此顶行是最近的提交(上例中的97206f5 peerish: set socket options earlier 4881af5 add semtest.c b3f8bea fdm: repair example ),然后每个下一行都是下一行(嗯,合并时更复杂,但是关闭足够)。

让我们说从上面开始,您可以立即告诉我标记为C2的提交是M6,即您需要跳过两次提交。只需将该值作为b3f8bea的最后一个参数提供:

git branch

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

git branch -f master b3f8bea

这样我就可以投放[alias] lol = git log --graph --decorate --oneline lola = git log --graph --decorate --oneline --all git lol

或者,如果您确切知道确实有两次提交,git lola(在这种情况下,在添加master~2之后,my_branch)将获得相同的SHA-1。 my_branch~2命令可以准确显示任何给定名称“均值”的SHA-1。在我这里的一个回购中,git rev-parseHEAD~2相同:

origin/featureX

但通常$ git rev-parse HEAD~2 0f5a13497dd3da8aff8e452c8f56630f83253e79 $ git rev-parse origin/featureX 0f5a13497dd3da8aff8e452c8f56630f83253e79 (或git log等)会为您提供原始SHA-1,您可以根据需要从中添加标签。