git操作练习
diff¶
commit¶
log¶
git commit -m "提交说明"
# 查看提交历史(按字母"q"键退出查看log状态):
git log
# 以简洁方式查看提交历史(仅显示一行信息而隐藏提交用户和提交时间):
git log --pretty=oneline
(显示如:ea2dd571ef424ddf4aed83be08f1af019c694c78 删除结尾空行)
# 以简洁方式查看提交历史(仅显示一行信息,且commit id仅显示7位):
git log --pretty=oneline --abbrev-commit
(显示如:ea2dd57 删除结尾空行)
branch¶
# 查看有多少分支
git branch
# 创建分支
git branch dev
# 删除分支
git branch -d dev
# 强制删除分支
git branch -D dev
# 强制修改某分支到某个位置(把dev1移动到dev2上)
git branch -f dev1 dev2
checkout¶
# 创建并进入新分支
git checkout -b dev1
# 切换不同分支
git checkout dev2
# 切换HEAD指针位置
git checkout HEAD^ # 切换指针到上次提交
git checkout HEAD~3 # 切换到上上上次提交
merge¶
合并两个分支时会产生一个特殊的提交记录,它有两个父节点,翻译成自然语言相当于"我要把这两个父节点本身及它们所有的祖先都包含进来"
# 把dev分支合并到master分支上(合并后master包含了父节点中的所有修改)
git checkout master # 先切换到master分支
git merge dev # 合并dev分支到master分支上
# 下面更新dev分支到最新
# 再把master分支切换到dev的分支上,这样dev分支和master分支都有最新的代码(因为master从上面合并之后就已经继承自dev分支了,所以下面什么也不会做,仅仅是把dev移动到锁指向的那个提交记录)
git checkout dev
git merge master
rebase¶
取出一系列的提交记录, "复制"它们,然后在另外一个地方逐个的放下去
# 把dev分支合并到master分支
git checkout dev # 先切换到dev分支
git rebase master # 把当前分支直接移到master分支,移动后两个分支(c3' c2)看起来像按照顺序开发的, 但其实他们是并行开发的, 原c3虽然半透明但是依然存在,此时c3'是我们 Rebase 到 master 分支上的 C3 的副本,此时在master所在分支的最顶端,下面需要更新master分支到最新版本
# 下面更新master到最新的dev版本
git checkout master # 切换到master分支
git rebase dev # 由于dev继承自 master,所以git只是简单的把master分支的引用向前移动了一下而已
HEAD¶
HEAD 总是指向当前分支上最近一次提交记录, 也就是指向你正在其基础上进行工作的提交记录
分离 HEAD 就是让其指向了某个具体的提交记录而不是分支名
在下面中 HEAD 指向 master, master 指向 C1
reset¶
通过把分支记录回退几个提交记录来实现撤销改动, 你可以将这想象成"改写历史", git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样
git reset --hard commit_id(即commit id) 可以指定具体的某个提交版本
Revert¶
reset对于远程分支是无效的, 为了撤销更改并分享给别人,需要使用revert
revert 之后就可以把你的更改推送到远程仓库与别人分享
撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的