版本控制
代码提交错误常用命令
- 最后一次代码提交时有拼写错误
经过几个小时的编码后,拼写错误很容易带到你的提交消息里面。 幸运的是,有一个简单的解决方案。
git commit --amend
这会打开编辑器,并允许你更改最后一次提交消息。 没有人知道你把“addded”单词多加了一个字母“d”的拼写错误。
- 忘了在最后一次提交中添加文件
另一个常见的Git陷阱是过早提交。 你少添加了一个文件,忘了保存它,或者需要对最后一次提交做一个小改动才有意义。 --amend 再次成为你的朋友。
添加错过的文件然后运行该命令。
git add missed-file.txt
git commit --amend
2
此时,可以修改提交消息,也可以只保存它以使其保持不变。
- 在代码库中添加了一个不想要的文件
但如果你的做法的正好相反呢?如果添加了不想提交的文件怎么办?一个环境文件,一个构建目录,或者是一张图片不小心保存到错误的目录?这都是可以解决的。
如果你所做的只是对文件进行了stage操作放入了暂存区,还没有commit本地代码仓库,那么只需重新设置暂存区的文件即可:
git reset /assets/img/misty-and-pepper.jpg
如果已经提交了更改,那么需要先运行一个额外的步骤:
git reset --soft HEAD~1
git reset /assets/img/misty-and-pepper.jpg
rm /assets/img/misty-and-pepper.jpg
git commit
2
3
4
这将撤销提交,删除图片文件,然后在其位置添加一个新的提交。
- 提交了所有的修改到 master 分支
你正在开发一个新特性,在匆忙之中,忘记为它打开一个新的分支。已经提交了一堆文件,现在它们都位于主分支(master)上。幸运的是,GitLab可以防止你直接推到master 主分支上。因此,我们可以使用以下三个命令将所有这些更改回滚到一个新分支:
Note
确保首先commit或stash更改,否则所有更改都将丢失!
git branch future-brunch
git reset HEAD~ --hard
git checkout future-brunch
2
3
这会创建一个新分支,然后将主分支回滚到进行更改之前的位置,然后最终检出新分支,并保留所有先前的更改。
- 分支名称出现了拼写错误
对错误分支进行重命名的方式与用mv命令重命名文件的方式类似:将它移动到一个新的位置,并使用正确的名称。例如把future-brunch分支名称更改为feature-branch。
git branch -m future-brunch feature-branch
如果已经push了这个分支到远程代码仓库,那么还需要一些额外的步骤。需要从远程代码仓库删除旧的分支,将新分支 push 上去:
git push origin --delete future-brunch
git push origin feature-branch
2
- 重复操作
这个命令适用于一切都出错的地方。 当从Stack Overflow复制粘贴一个太多的解决方案时,
代码仓库处于比你一开始时更糟糕的状态。
git reflog向你显示所有的事情列表。然后,它允许你使用Git的神奇时间旅行技巧,回退到过去的任何时间点。这里应该指出,这是最后的手段,不应该轻易使用。要得到这个列表,输入:
git reflog
我们采取的每一步,我们所做的每一个动作,Git都有记录。 在我们的项目上运行该命令得到以下列表:
3ff8691 (HEAD -> feature-branch) HEAD@{0}: Branch: renamed refs/heads/future-brunch to refs/heads/feature-branch
3ff8691 (HEAD -> feature-branch) HEAD@{2}: checkout: moving from master to future-brunch
2b7e508 (master) HEAD@{3}: reset: moving to HEAD~
3ff8691 (HEAD -> feature-branch) HEAD@{4}: commit: Adds the client logo
2b7e508 (master) HEAD@{5}: reset: moving to HEAD~1
37a632d HEAD@{6}: commit: Adds the client logo to the project
2b7e508 (master) HEAD@{7}: reset: moving to HEAD
2b7e508 (master) HEAD@{8}: commit (amend): Added contributing info to the site
dfa27a2 HEAD@{9}: reset: moving to HEAD
dfa27a2 HEAD@{10}: commit (amend): Added contributing info to the site
700d0b5 HEAD@{11}: commit: Addded contributing info to the site
efba795 HEAD@{12}: commit (initial): Initial commit
2
3
4
5
6
7
8
9
10
11
12
记下最左边的列,因为这是索引。 如果要返回历史记录中的任何一点,请运行以下命令,将{index}替换为该引用,例如dfa27a2。
git reset HEAD@{index}
虽然没用过git,但是还是忍不住保存了下来。如果自己以后的过程遇到了这方面的知识,还是可以翻出来看看的
gitflow概念
Git Flow是构建在Git之上的一个组织软件开发活动的模型,是在Git之上构建的一项软件开发最佳实践。Git Flow是一套使用Git进行源代码管理时的一套行为规范和简化部分Git操作的工具。Git Flow重点解决的是由于源代码在开发过程中的各种冲突导致开发活动混乱的问题。因此,Git flow可以很好的于各种现有开发模型相结合使用
Gitflow图解:
git rebase vs git merge
git merge
- 记录下合并动作 很多时候这种合并动作是垃圾信息
- 不会修改原 commit ID
- 冲突只解决一次
- 分支看着不大整洁,但是能看出合并的先后顺序
- 记录了真实的 commit 情况,包括每个分支的详情
git rebase
- 改变当前分支 branch out 的位置
- 得到更简洁的项目历史
- 每个 commit 都需要解决冲突
- 修改所有 commit ID
git stash
git stash用于想要保存当前的修改,但是想回到之前最后一次提交的干净的工作仓库时进行的操作.git stash将本地的修改保存起来,并且将当前代码切换到HEAD提交上.
通过git stash存储的修改列表,可以通过git stash list查看.git stash show用于校验,git stash apply用于重新存储.直接执行git stash等同于git stash save.
开发到一半,同步远端代码
当你的开发进行到一半,但是代码还不想进行提交 ,然后需要同步去关联远端代码时.如果你本地的代码和远端代码没有冲突时,可以直接通过git pull解决.但是如果可能发生冲突怎么办.直接git pull会拒绝覆盖当前的修改.
遇到这种情况,需要先保存本地的代码,进行git pull,然后再pop出本地代码
git stash
git pull
git stash pop
2
3
工作流被打断,需要先做别的需求
当开发进行到一半,老板过来跟你说"线上有个bug,你现在给我改好,不然扣你鸡腿".当然,你可以开一个新的分支,把当前代码提交过去,回头再merge,具体代码如下
正确姿势
# ... hack hack hack ...
git stash //保存开发到一半的代码
edit emergency fix
git commit -a -m "Fix in a hurry"
git stash pop //将代码追加到最新的提交之后
# ... continue hacking ..
2
3
4
5
6
7
提交特定文件
如果对多个文件做了修改,但是只想提交几个文件,或者想先暂时保存几个修改,测试其他文件的执行结果.可以通过git stash save --keep-index来进行.
# ... hack hack hack ...
git add --patch foo //只将第一部分加入管理the index
git stash save --keep-index //将其余部分保存起来
edit/build/test first part
git commit -m 'First part' //提交全部的git管理中的代码
git stash pop //继续进行存储代码的工作
# ... repeat above five steps until one commit remains ...
edit/build/test remaining parts
git commit foo -m 'Remaining parts'
2
3
4
5
6
7
8
9
恢复被错误clear/drop的存储
如果因为失误对存储仓库进行了clear或者drop操作,在一般机制下是不能恢复的.但是可以通过以下指令来获取仍在仓库中的,但是已经不可获取的存储列表
git fsck --unreachable |
grep commit | cut -d\ -f3 |
xargs git log --merges --no-walk --grep=WIP
2
3
**git push -u **
**绑定默认提交的远程版本库,加了参数-u后,以后即可直接用git push 代替git push origin master