我正在使用带有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")
我如何解决此错误并将所有这些未跟踪文件从主 移至另一个分支已存在?谢谢。
答案 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)
你是在简单的情况下;只需使用Henrik N's answer。
您更新的问题/评论表明您已经提交了更改和未提交的更改,并且您在某些跟踪分支上执行了所有更改,例如跟踪master
或origin/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
是索引中的内容(i
,git add dir/file1
等),git rm file2
显示为git status
,changes to be committed
是w
显示为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
,因此您现在同时拥有C2
和master
。然后,它会重写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/master
或git 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_branch
,git add
,git 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
,提交。)您可以找到“真实姓名”,或者您可以找到一些替代名称或缩写名称同样的事情。
名称有很多选项,但让我们坚持使用来自HEAD
和git 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-parse
与HEAD~2
相同:
origin/featureX
但通常$ git rev-parse HEAD~2
0f5a13497dd3da8aff8e452c8f56630f83253e79
$ git rev-parse origin/featureX
0f5a13497dd3da8aff8e452c8f56630f83253e79
(或git log
等)会为您提供原始SHA-1,您可以根据需要从中添加标签。