Git笔记
Git
rebase 变基
在使用rebase命令的时候, 要知道.
rebase命令是为了最后的提交历史是单独一条清晰的线路
# 把bugFix分支合并到master内
git rebase master bugFix
如果只传入一个参数的话,默认把当前分支合并到指定分支内.
与上面的效果相同的情况下, 就是
git checkout bugFix
git rebase master
如果是HEAD
所在是将要合并进去的小分支, 可能会比较省事.
作为管理方, 应该养成传双参的习惯.
高级使用方法
git rebase side3 master
当side3
和master
在一条分支上的时候,使用rebase命令直接把后面branch拉到前面branch. 这个时候 两个分支的位置都在 branch1 的位置上. 且HEAD在后一个分支上.
相当于
git branch -f master side3
git checkout master
这个时候采用这种方式能节省一次切换开销, 更加方便省事.
但是要注意, 前提是两个分支都在一条提交线上, 只有先后之分.
checkout
ckeckout 操作的是 HEAD
游标
branch
branch 操作的是 <branch-name>分支名
游标
reset
撤消提交, 清除之前的提交历史. 把之前的已提交
退到暂存区
.
git reset master^
1 ==> 2
撤消2, 则
1
说明:
此时2
来到暂存区, 记录上没有2.
此时的1
和之前的1
, 内容一样,且HEAD相同
revert
不撤消之前的提交记录, 生成新的提交记录, 在新的提交记录里删除之前的提交.
git revert HEAD^
1 ==> 2
撤消2, 则
1 ==> 2 == 1'
说明:
相当于又提交了一次, 这次提交里面是把上次的提交删除掉
此时新的1'
和之前的1
, 内容一样,HEAD不同
cherry-pick
优选命令: 该命令是把 别的分支
对应的提交记录
添加到当前的分支
之上
使用场景:
- 在多次提交之后, 只想要保留
其中个别
提交记录的时候.
rebase -i
调节命令: 当需要调节 当前分支的提交记录的时候, 使用该命令. 会单独出现一个rebaseUI界面.(vim或其他文本)
在这个界面里能做三个事
- 调节顺序
- 删除提交
- 合并提交
commit --amend
当我们需要进行修改 上次
的提交记录的时候, 就可以使用 commit --amend
该命令的限制条件就是, 只能修改 上次提交的记录.如果不是,那么则无法修改.
但是好在, 我们在上面的命令行里学到, rebase -i
是可以调整提交的顺序的.
这样, 就可以通过rebase -i
来更改对应的提交顺序, 之后调用 commit --amend
, 来修改对应的提交内容. 之后再次调用 rebase -i
来还原对应的提交内容.
fetch
就是下载. 把远程仓库中有的, 而本地仓库中没有的东西下载下来.
并且更新origin/master
但不更新master
所以下载的东西只在本地仓库有体现, 而工作区中是没有变化的.
fetch和pull的区别
fetch 只有一个动作: 下载 # HEAD保持原样不动
pull 有三个动作: 下载, 合并(merge). # HEAD 发生改变 (同merge)
历史偏移
在使用git的时候, 最多的问题出现的节点在于. 你之前所拉的远程分支, 现在已经更新过许多次.
你的origin/master
已经是很古老的版本了.
这种情况下, git是不会允许你直接push代码到远程仓库的.
想要push
需要先让本地的origin/master
和远程的内容保持一致.
所以需要的是, 先进行同步, 才推送.
方法有两种:
# rebase 方法(保持一条提交记录)
git fetch & git rebase origin/master master & git push
# 等同于
git pull --rebase & git push
# merge 方法(有两条合并记录)
git fetch & git merge origin/master master & git push
# 等同于
git pull & git push
远程跟踪
remote tracking
远程仓库和本地仓库的关联关系, 默认同名
可以修改, 以实现某些分支策略.
git checkout -b 本地分支 远程分支
git branch -u 远程分支 本地分支
例:
git checkout -b foo origin/master
# 或
git branch -u origin/master foo
此时本地分支foo
关联远程master, 无论pull还是push, 都与远程的master互动.
push
git push <remote> <place>
通常push的两个参数是省略的, 如何HEAD没有在需要推送的分支之上 , 则在使用的时候需要填写对应分支.
:符号使用
# 删除远程分支foo和本地的关联origin/foo
git push origin foo:
# 创建本地分支foo
git fetch origin foo: