Git

214 阅读2分钟

工作区、暂存区、版本库概念

image.png

常规操作

克隆代码

git clone git@github.com:shizhongyu/ScreenShotTest.git

查看本地的代码状态

git status 命令用于显示工作目录和暂存区的状态。

同步代码

同步远端分支变化

// 拉取指定分支的变化
git fetch origin master 
// 拉取所有分支的变化
git fetch 
// 拉取所有分支的变化,并且将远端不存在的分支同步移除【推荐】
git fetch -p

同步远端代码变化

// 都是先 git fetch,然后执行合并操作
// 不同的是,git pull 执行的是 git merge,git pull -r 执行的是git rebase
git pull origin master 
git pull -r origin master

Commit

新增 commit

// 添加文件到缓存区,然后提交到本地仓库
git add files
git commit -m '提交备注'

撤销 commit

// 会将提交记录回滚,代码还在
git reset b14bb52

// 会将提交记录回滚,代码会没
git reset --hard b14bb52

// 将部分代码文件回滚
git checkout -- files

合并 commit

// Git 提供了两种合并 commit 的方式
git merge master
git rebase master

问题

reset 和 checkout 的区别

image.png

例如,假设我们有 master 和 develop 分支,它们分别指向不同的提交(上图左边);我们现在在 develop 上(所以 HEAD 指向它)。 如果我们运行 git reset master,那么 develop 会和 master 指向同一个提交; 而如果我们运行 git checkout master 的话,develop 不会移动,HEAD 自身会移动,指向 master。

所以,虽然在这两种情况下我们都移动 HEAD 使其指向了提交 A,但做法是非常不同的。 reset 会移动 HEAD 分支的指向,而 checkout 则移动 HEAD 自身。

rebase 和 merge 到底有什么区别

merge

image.png

rebase

image.png

总结: git merge 处理冲突更直接,而git rebase 能够保证清晰的 commit 记录。

理解 git rebase

其实“git rebase”就是一系列的“cherry-pick”,只是这一系列的动作用一条命令(git rebase)给完成了。你完全可以通过多次手动“cherry-pick”来复制其行为(不过不太方便,更容易出现人为错误)。

参考: