从http://github.com/maximveksler/IKnowKungFu
的干净克隆开始➜ IKnowKungFu git:(master) git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
我想创建一个临时分支
➜ IKnowKungFu git:(master) git checkout -b submodule_nightmare
Switched to a new branch 'submodule_nightmare'
做了一些改变
➜ IKnowKungFu git:(submodule_nightmare) ✗ git status
On branch submodule_nightmare
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: .gitmodules
deleted: Carthage/Checkouts/Nimble
deleted: Carthage/Checkouts/Quick
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: .gitignore
modified: bin/setup
他们我决定放弃整个分支(没有提交任何提交)。我该怎么做呢?
我试过
➜ IKnowKungFu git:(submodule_nightmare) ✗ git checkout master
M .gitignore
M .gitmodules
D Carthage/Checkouts/Nimble
D Carthage/Checkouts/Quick
M bin/setup
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
➜ IKnowKungFu git:(master) ✗ git branch -D submodule_nightmare
Deleted branch submodule_nightmare (was 42e46fd).
➜ IKnowKungFu git:(master) ✗ git branch
* master
➜ IKnowKungFu git:(master) ✗ git branch --list
* master
这似乎完全删除了分支,但是当我尝试“从头重新创建它”时,git似乎仍然记得我所做的更改:
➜ IKnowKungFu git:(master) ✗ git checkout -b submodule_nightmare
M .gitignore
M .gitmodules
D Carthage/Checkouts/Nimble
D Carthage/Checkouts/Quick
M bin/setup
Switched to a new branch 'submodule_nightmare'
➜ IKnowKungFu git:(submodule_nightmare) ✗ git diff
➜ IKnowKungFu git:(submodule_nightmare) ✗ git status
On branch submodule_nightmare
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: .gitmodules
deleted: Carthage/Checkouts/Nimble
deleted: Carthage/Checkouts/Quick
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: .gitignore
modified: bin/setup
为什么这样?
P.S。如果你想知道分支名称,git / Carthage最近给了我hard times ..
答案 0 :(得分:1)
分支已正确删除,但未触及对工作目录的更改。在checkout回master时,submodule_nightmare分支中所做的更改实际上不会被还原/撤消,也不会再次重新创建submodule_nightmare分支。
这是因为您的两个分支是相同的提交,因此当您切换分支时,工作目录中没有要更改的文件。这是一个功能,允许您,例如,对master进行一些更改,决定应该在不同的分支上完成工作,然后使用git checkout -b newcode
更改为该分支,而不必以任何方式保存您的更改
为了恢复对工作目录的跟踪文件所做的所有更改,需要运行像git reset --hard
这样的破坏性命令(这会撤消你的工作,所以要小心)。可以使用git clean
的一些参数清除未跟踪的文件(也是破坏性的,谨慎使用)。
如果您之间切换的两个分支在不同的提交上,并且对两个分支之间不同的文件进行了更改,那么如果您尝试切换分支而不告诉Git该做什么,则会导致错误。这是因为Git避免破坏你的工作,除非你告诉它,所以它会中止,直到你告诉它如何处理更改的文件。
作为一个例子,让我们说更新的Cartfile是在master中提交的,但现有的分支submodule_nightmare没有这个提交。然后对master中的Cartfile进行了一些更改但未提交。如果您尝试使用git checkout submodule_nightmare
将分支切换到submodule_nightmare,则会出现以下错误:
error: Your local changes to the following files would be overwritten by checkout:
Cartfile
Please, commit your changes or stash them before you can switch branches.
Aborting
Git清楚地告诉您,您需要以某种方式保存更改(提交或存储),或撤消它们(例如git checkout master Cartfile
或手动编辑),然后才能切换。