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