跳转至

git操作练习

练习网址 https://learngitbranching.js.org/?locale=zh_CN

diff

# 修改文件后查看修改了哪些地方:
git diff readme.txt

# 查看工作区和版本库的区别:
git diff HEAD -- readme.txt

commit

git commit -m "提交说明"

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分支到最新版本

1590496537498.png

# 下面更新master到最新的dev版本
git checkout master  # 切换到master分支
git rebase dev # 由于dev继承自 master,所以git只是简单的把master分支的引用向前移动了一下而已

HEAD 总是指向当前分支上最近一次提交记录, 也就是指向你正在其基础上进行工作的提交记录

分离 HEAD 就是让其指向了某个具体的提交记录而不是分支名

在下面中 HEAD 指向 master, master 指向 C1

1590498293376.png

reset

通过把分支记录回退几个提交记录来实现撤销改动, 你可以将这想象成"改写历史", git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样

git reset --hard commit_id(即commit id) 可以指定具体的某个提交版本

1590498532973.png

Revert

reset对于远程分支是无效的, 为了撤销更改并分享给别人,需要使用revert

revert 之后就可以把你的更改推送到远程仓库与别人分享

撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的

1590498708263.png