Skip to main content

Git 基础

初始化本地代码到远程仓库

git init
git remote add origin https://remote-git-url
git pull origin master
git add .
git commit -m "init"
git push origin master

分支使用

创建分支

git checkout -b feature/xxx

查看本地分支

git branch
git branch -a // 查看本地+远程分支

删除分支

git branch -d feature/xxx

LFS

安装

// mac上可以通过Homebrew安装, 也可以通过其他的方式
brew install git-lfs
// 安装好git lfs以后, 还需要执行一下初始化的命令 - 只需全局执行一次
git lfs install

rebase vs merge

推荐使用 rebase 变基,而不是 merge 合并,因为 merge 会让提交记录看着混乱,有的团队提交仓库要求必须从 master 最新版本开始提交,所以就会有很多提交记录是这样子的:

checkout: moving from master to feature/ad-support
checkout: moving from feature/ad-support to master

当然 merge 相对比 rebase 要简单。 rebase 的好处是提交记录很干净,如果不小心合入了 master,而又需要拆分上 release,就比 merge 好处理得多。

revert

revert 行为其实是将某次提交之后,开一个新的提交,这个新提交把上一个提交的内容都 revert 掉,然后将这个新提交合入到分支中。 需要注意的是当 revert 一个 merge 提交时会有问题,因为 merge 是将两个分支合并,revert 并不知道将代码回滚后应该合入到哪个前分支,在 git 中这个前分支叫 parent 分支。于是 revert 一个 merge 提交,就需要传入要合入的 parent 分支,即:

git revert -m parentID

比如 log 是:

commit 77c5edf7c75a9b04e69f4b9c627bca7ab92f9568 (master)
Merge: 91a7dbab4 72def63a7

其中 Merge 的第一个就是 parentID 为 1,另一个是 2。左边的是被合入分支,右边的是合入分支。比如在合并时,本地是 feature/xx 分支,要合入的是 master,那么左边的 parent 就是 feature/xx,右边的 parent 就是 master。现在要在 master 上 revert 掉 feature/xx 分支的合入:

git revert -m 2

合并提交

有这么一个场景,有个需求从 master 拉取分支,开发了一段时间后被告知 master 由于种种原因不能合入 release,但是该功能依然需要继续开发,而且要提前于 master 合入 release 上线,也就意味着这个从 master 拉的分支不能带 master 的代码,还要合入 release 进行上线,而这个分支还要继续开发。这个时候可以考虑将这几次的提交合并到一个上,然后变基到 release,然后再继续开发。

git rebase -i

将需要合并的提交前缀改成s,然后保存即可。

同步分支

git remote prune origin

将本地分支与远程分支进行同步,如果在远程分支中没有的本地分支,则会把本地分支删除。 所以在使用前,切记一定要把未提交的代码先 push 到远端。

这个命令对于删除本地大量无用的分支非常好用。

删除空目录

当远程代码删除后,同步到本地,虽然代码被删除了,可是代码的目录还在,会存在一堆的空目录。执行命令删除这些空目录:

git clean -fd

pull origin master 报错

报错提示:

fatal: refusing to merge unrelated histories

解决:

git pull origin master --allow-unrelated-histories