本文收录git的一些用法,常用or不常用
PS: 都是命令行操作,对应IDE操作不做记录
一、远程覆盖本地
git reset origin/feature --hard
这其实是回退操作的一种变形,reset 可以指定提交也可以指定分支,还可以指定几次HEAD~[number]
二、rebase拉取
git pull --rebase
等价于
git fetch origin/[branch_name] & git merge origin/[branch_name]
可以设置为默认方式
git config --global pull.rebase true
三、rebase 变基
git checkout [branch1_name]
使 [branch1_name]
分支的提交基于 [branch2_name]
git rebase [branch2_name]
如

执行命令
git checkout feature-2 & git rebase master
变成

(图片来源git rebase 使用)
四、rebase 修改历史
git rebase -i HEAD~[number]
或指定一个提交进行rebase, 此提交之后的所有commit
都会被编辑
git rebase -i [commit-id]
-i
交互式运行
这时候从上到下就是从早到晚,修改保存以后,git就会从上到下地执行。在这个界面内,你可以做一些事情,比如:
- 更换提交顺序 - 编辑器内移动提交顺序
- 合并某些提交 -
f
/s
- 拆分某些提交 -
e
- 修改某些提交信息
五、提交合并
git rebase -i [commit-id]
各个命令释义

-
p
正常应用此次提交 -
r
重写提交信息 -
e
修改本次提交(比如git commit -p
可以用于拆分提交) -
s
本次提交合并到上面(就是编辑页面的上下
)一个提交中 -
f
同s
, 不保留提交信息 -
x
暂不清楚 -
d
丢弃本次提交
使用 s
或 f
就可以将本次提交合并到前一次提交。
六、其他
- 交互式命令
-p
add -p
选择那些需要提交(stage
)
commit -p
自定义commit
(powerful
!) - 清除
uncheck
文件git clean -f
- 清除远程已删除的分支
git remote prune origin
git bisect
-
git push -u
与远程分支添加连接 -
git diff [branch_name]...
如果用2个点进行diff
,会把[branch_name]
的新增代码显示出来
用3个点进行diff
,只会显示当前分支与[branch_name]
的最近公共祖先与当前分支的差异。
实例1
下面看一个使用commit -p
拆分单文件提交的例子
劝退警告!!
注意git命令只能拆分不连续的提交,并选择接收哪些提交;如果是连续的提交,需要人工修改文件后自行提交
首先看下提交信息

看下最新的提交内容

进入交互模式
git rebase -i HEAD~2
注意, rebase 是不是不能编辑所有提交的,第一个提交是不能动的,也就是说,如果你只有两次提交,
HEAD~2
是不行的,最多HEAD~1
所以我们需要再来一次提交

然后就可以编辑前两次提交了

把需要拆分的提交前面操作改成e
或edit

保存退出.

查看状态

可以看到,状态信息告诉我们,当前正在交互式rebase,当前命令是 e d415576
,下一条是pick 5bb4450
,说明rebase确实是从上而下的执行命令的
接下来我们开始拆分这次提交
- 首先撤销提交
git reset HEAD~1

这时候你可以修改这次提交。
- 然后交互式(
-p
)提交
commit -p
commit -p -help
-
e
编辑提交内容与提交信息 -
s
进行拆分(s
选项用不了是因为你只有一段连续的修改无法拆分) -
y
应用拆分 -
q
完成拆分
上图中明显只有一处连续修改,故再来改一下,加三行,如下

到这一步,我们阐述一下我们的需求
总体流程是往一个文件a中添加了两次数据分别是
x0
x1
x2
和
b0
...
b6
现在需要把本次提交中的 x0 x1 x2 给剔除掉,那么我们继续
再执行一下commit -p

有s
选项了,那么就可以进行拆分了,git会将连续的部分视为一个提交

输入提交信息

查看一下git log

再看下目前数据

发现x0-x2已经变成了修改而不是提交了,如果你还需要这些信息作为一个新的提交,那就可以执行
git commit -a -m "add x0-x2"
这里我们选择丢弃这部分修改继续rebase

其实上面过程可以非常简单,直接人工修改后多段提交,看个人习惯,肯定选择自己最熟悉最有把握的方式。对于我而言,以上操作纯属炫技~~~
如果是拆分一个提交的多个文件就更简单了,直接分段提交都不用commit -p
本例参考连接
git 奇技淫巧
最后在你实际环境中使用git的时候,不可避免的会遇到冲突,需要更多的技巧与能力来帮助你解决这些冲突,也可以借助一些IDE工具,比如 IDEA 的Git 工具用来解决冲突真的是我见过对用户最为友好的方式了。
未完待续~
网友评论