前置条件:git
在正式开始以前,咱们须要先肯定几个概念。下面所提到的 master
分支默认为代码提交的主分支。shell
本地分支是指咱们在平常开发中本身经过 git checkout branch xxx
创建的分支,远程分支是咱们通过 git push -u origin xxxx
推到 git 服务器的分支,在咱们推送以后,git 会帮咱们在本地创建一个以 orgin/
开头的分支,这个咱们也叫远程分支,咱们平常操做的就是本地分支 xxx
和远程分支 origin/xxx
,origin/xxx
就是远程的 git 服务器在咱们本地创建的一个分支的对照版本(我以为这样说应该比较容易理解),咱们平常的 git fetch --all
就是将本地的 origin/xxx
与 git 服务器的 origin/xxx
分支进行同步。数据库
咱们每次提交代码都会根据本次提交的内容生成一个几乎惟一的 id ,这个 id 重复的几率几乎为 0,咱们能够这样理解,咱们每次的提交都会生成一个惟一索引的记录,不论是本地的 git,仍是远程的 git ,咱们都将她理解为一个数据库,只要咱们进行了 commit 操做,那么能够几乎肯定,咱们的代码是不会丢失的,咱们均可以经过 commit id 找到那条提交记录的内容。数组
本篇文章不会讲解,分支与分支之间的版本比较等内容,做者比较菜,怕掌握很差度翻车。缓存
建立分支咱们可使用 git checkout branch xxx
来建立一个新分支,这个很容易理解,可是若是咱们如今在分支 branch-1,可是咱们想新建一个基于远程 master 最新版本的分支,咱们该怎么办呢,不能说如今我回到 master,而后 git pull
拉取最新的 master 分支代码,而后建立分支,很繁琐对不对,这里咱们就能够进行里一个操做了:git fetch --all
记得咱们上面提到的吧,同步远程分支代码, --all
能够改为 origin/master
,而后进行 git checkout branch xxx origin/master
后面的 origin/master
表明咱们是基于远程分支 origin/master
进行建立的。服务器
好比我如今已经在本地 commit
一次了,可是发现还有东西忘改了,若是我在 commit 一次就会生成两条记录,这样从提交记录上看可能不太好看,而后咱们就可使用 git commit --amend
对上一次的提交记录进行追加,这个操做的前提是上一次提交必需没有推送到远程分支,不然,你会发现操做以后在进行 git push
会提示你版本不一致不容许提交,固然若是你能够保证提交没有错误,且这一个分支只有你本身一我的玩,那你就可使用 git push -f
进行强制提交了,这个操做很危险,谨慎使用。app
我比较喜欢 rebase
操做,因此在这里就只会讲解 rebase
操做了。rebase
的使用场景。fetch
branch-a
分支工做,可是这个任务有点困难,你已经在这个分支工做很长时间了,很长时间都没有同步 master 分支的代码了,而后同组的小伙伴合并了一个新功能这个功能你须要使用,这个时候你就能够在当前分支使用 git rebase origin/master
了,这个操做会将你在这个分支的提交附加于最新的 master 分支版本以后,很明显这个操做以后你当前本地的 branch-a
和远程的 origin/branch-a
已经不同了,因此有一个缺点就是你只能选择 git push -f
进行提交。branch-a
分支也修改过的代码,而且你的小伙伴已经提交了,这个时候,你的 branch-a
分支就会和 origin/master
分支有冲突,嗯,这个时候你也可使用 git rebase origin/master
这个操做来解决冲突,并同步最新的 master
的代码。branch-a
分支提交代码,结果小伙伴比你先提交了,这个时候你再提交会发现版本不一致没法提交,这个时候咱们就推荐使用 git pull --rebase
,其实 git pull
命令后面是有一个默认参数的那就是 --merge
,会给咱们刚接触 git 的同窗形成不少麻烦。因此在这 git pull --rebase
是一个不错的选择。rebase
的另一个骚操做:合并 commit
git rebase -i HEAD~X
x 表明从当前的提交记录往回回溯的提交记录的个数,执行这个操做以后咱们就能够看到一个这样的交互界面: 翻译
git log
就能够看到一个新的提交记录:
git cherry-pick
咱们可能会有这样一个使用场景,在分支 branch-a
须要分支 branch-b
的某次提交,这个时候咱们就能够先找到 branch-b
的那次提交记录的 id,而后在 branch-a
分支进行 git cherry-pick b-commit-id
将 branch-b
分支的提交记录拿过来了code
那若是咱们只须要 branch-b
分支的某个文件呢该怎么办呢,莫慌再交你一个操做,git checkout xxx file
这个操做能够将其余分支的文件拉取到当前分支,注意这个操做是覆盖式的,也就是若是你这个分支的这个文件已将存在,那么这个操做将会覆盖你当前分支的这个文件。能够发挥一下 xxx
也能够是远程分支。
git checkout branch -- file
那么这个操做又是干吗的呢,这个操做能够将你的某个文件还原到某个分支的版本。若是某次你手误提交了错误的文件,可是改动又忘了,那么这个命令或许能够帮到你。
git prune
根据官方的解释,直白一点的翻译就是删除 git
数据库中不可访问的对象,那个人理解是这样的,git prune
删除的是你本地 .git 下的 object 目录下,没有被使用到的 hash 值,我理解的是它会删除 origin/xx
开头的没有用到的分支,这个分支在你的远程的 git 服务器中已经删除可是本地任然存在 origin/xxx
的映射,这个时候你就可使用 git prune
来删除本地的 origin/xxx
的映射,可是官方推荐使用的是 git gc
,而想删除本地的 xxx
分支,就只能只用 git branch -D XXX
,在这附上一条咱们部门本身写的一个清除本地无用分支的 shell git fetch --all --prune && git branch -vv | grep gone | awk '{ print $1 }' | grep -v pit | xargs git branch -D
。
git stash
git stash
能够帮助咱们来暂存一些更改,我推荐的是若是只是少部分的更改,使用 stash
是能够的,多了的话,推荐新建分支来保存更改,以避免本身忘记了哪一个 stash
。那咱们该如何取出这些更改呢,最经常使用的就是 git stash pop
它会将你最新一次的 stash 从一个缓存数组里面推出来,这样的话若是咱们操做不当极可能就丢失了这些更改。我推荐的是使用 git stash apply
,这个会将你最新一次的 stash 从缓存数组里面 copy
一个副本返还给你,缺点就是,你本地的 stash 数组会愈来愈大,固然,你能够定时清空一下。还有一个场景,若是我想取出指定的 stash 该怎么办呢,在这咱们可使用 git stash list
来查看一下本身本地的 stash 记录的形式:
git stash pop/apply stashid
来取出指定的 stash。
目前以为这些在平常工做中使用的比较多,还有一个 patch 没说,由于用得比较少,若是再想到其余的内容我会在这篇文章上进行修改。若是本文有错误的地方还请你们能够指正,谢谢。