Unix哲学就是:没有情况就是好情况!
1、安装oh my zsh
(1)基于Mac自身的bash安装一个更好用的bash:oh my zsh:直接在Mac终端运行命令即可:sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
(2)upgrade_oh_my_zsh:更新oh my zsh。
(3)cd /Users/cmm/.oh-my-zsh/plugins/git:Mac安装完oh_my_zsh后配置别名的配置文件位置(配置文件:git.plugin.zsh)。
(4)uninstall_oh_my_zsh:卸载oh my zsh也很简单。
2、git stash 的应用
(1)git stash、git stash save "message"、 git stash pop、 git stash apply
git stash 命令(git stash save "message" 命令是给当前你准备缓存的内容起一个名字)可以将在当前分支修改的内容放到本地缓存区中,并会自动建立一个缓存的list集合,方便管理。
如果想将修改的内容重新释放出来,git stash apply 和 git stash pop 都可以达到这个目的。
但是两者有什么区别呢?刚才说过,git stash 可以形成list 集合,通过 git stash list 可以看到list下的所有list内容,而通过 git stash clear 可以删除当前分支list中的所有内容,通过 git stash drop stash@{0} 可以删除当前分支list中指定编号为 0 的缓存。
用 git stash apply stash@{0} ,可以将编号为 0 的缓存释放出来,但是该缓存还存在于list中。
而 git stash apply,会将当前分支的最后一次缓存的内容释放出来,但是该记录还存在list中。
而 git stash pop,也会将当前分支的最后一次缓存的内容释放出来,但是该记录会被删除 而不再存在于list中。
(2)在使用git的时候往往会保存一些东西,在保存的时候使用的就是 git stash,强大的git使得保存修改和恢复修改变的很容易,但有时候时间久了不记得stash里面的内容是什么了,找到一个好的方法可以帮助我们查看stash中的内容,git stash show -p stash@{1}:查看第二最近stash的变化。
【番外篇】https://www.cnblogs.com/tocy/p/git-stash-reference.html
3、git branch 、 git merge 的应用
git branch:查看该项目下本地仓库的所有分支。
git branch -r:查看该项目下远程仓库的所有分支。
git branch -a:查看该项目下本地仓库和远程仓库共有的所有分支。
git branch -v:查看本地仓库中各个分支的最后一次的提交信息。
git branch --merged:查看哪些分支已经合入当前分支。
git branch -d cmm-0815-wind:删除本地分支cmm-0815-wind。
git branch -D cmm-0815-wind:强制删除本地分支cmm-0815-wind(因为cmm-0815-wind分支内容还没有合入master主分支!)
git push origin --delete cmm-0815-wind(git push origin :cmm-0815-wind):删除本地分支cmm-0815-wind对应的远程分支cmm-0815-wind。
git checkout master、git pull( git fetch )、git checkout -、git merge master:把最新的master分支合入当前分支。
git merge --abort:如果git merge的时候出现冲突,可以执行这个命令取消这次merge。
git remote -v:显示所有的远程仓库地址。
git init:新建了一个learngit文件夹,在bash中cd进入该文件夹,用 git init 命令创建一个本地仓库。
git ls-files --stage:查看本地暂存区中的内容。
git branch -m oldbranchname newbranchname:本地分支重命名。如果修改远程分支,只需要将本地分支重命名为新分支名称,然后删除远程分支,再把本地分支上传就可以了。
4、git checkout 的应用
git branch branchName:创建新分支branchName。
git checkout branchName:切换到新分支branchName。
git checkout -b branchName:上述两个命令合并为一个命令:创建新分支branchName,并且切换到新分支branchName上。
git checkout -b cmm-0815-wind:基于当前分支创建一个新的分支 cmm-0815-wind,并且head指针也指向新分支 cmm-0815-问wind 的头部。
git checkout - :切换到上一个分支。
git checkout . :恢复暂存区中的所有内容到工作区。
git commit -m "message":把暂存区中的所有修改提交到本地仓库。注意:工作区做了修改 但是没被添加 git add 到暂存区的修改不会被提交到本地仓库。
git commit -am "message":把暂存区中的所有修改提交到本地仓库。注意:工作区做了修改 但是没被添加 git add 到暂存区的修改也会被提交到本地仓库。a 的含义就是默认添加。
git checkout -- . :工作区做了一些修改,并且没有被添加 git add . 到暂存区,此时使用该命令删去刚才做的所有修改。
git add . :把当前分支修改的全部文件添加到本地仓库的暂存区中,但是没有被提交到本地仓库,这时使用 git commit -am "message" 可以提交到本地仓库中,这时使用 git push origin head -u 可以使本地分支被提交到远程仓库中,并将本地分支与远程分支建立track联系。
【若是 git add . 之后,发现不想 git add . 了,则可以使用 git reset head 使暂存区中的内容回到工作区,再使用 git checkout -- . 可以删去本次所有的修改。】
git checkout -- fileName1:对本地分支cmm-0815-wind修改了一堆文件,比如fileName1、fileName2等,没有执行 git add . 添加到到本地暂存区,此时想放弃fileName1的修改。
git reset head fileName1:对当前分支的fileName1文件做了修改,且已经执行 git add . 添加到暂存区,此时执行这个命令会把对文件fileName1的修改从暂存区中删除掉,且重新放回工作区中。
git reset commit_id1:本地通过 git add & git commit 之后,想要撤销此次commit。这个id是你想要回到的那个节点,可通过 git log --oneline 查看,可只选前6位 。撤销这次提交后,你所做的已经commit的修改还在工作区!
(1)git lg:通过该命令拿到你想要回退到的那个版本号;再通过下面这个命令回退到那个版本即可。
(2)git reset --hard commit_id1:这个id是你想要回到的那个节点,可通过 git log --oneline 或者 git reflog 查看,可以只选前6位。撤销这次提交之后,你所做的已经commit的修改将会清除,仍在工作区/暂存区的代码不会清除!
工作区 - 暂存区 - 本地仓库 - 远程仓库
三者的使用情况:(1)代码编写及修改是在工作区。(2)git add 将本地修改添加到暂存区。(3)git commit 将暂存区中的内容提交到本地仓库。(4)git push 将本地仓库中的内容提交到远程仓库。
git reset --hard head
三者的改变全都丢失,即代码的修改内容丢失。
git reset --soft head
回退到git commit之前,此时处在暂存区(即执行git add 命令后)。
git reset --mixed head
就等于 git reset head 回退到工作区,即git add 之前。
5、将git远程仓库里的指定分支 cmm-wind 拉取到本地(一开始的时候本地并不存在 分支 cmm-wind )
方法一:
(1)当我想从远程仓库里拉取一条本地不存在的分支时:git checkout -b cmm-wind origin/cmm-wind (一般情况下,让本地分支名和远程分支名保持一致)。格式:git checkout -b 本地分支名 origin/远程分支名
(2)这时,将会自动创建一个新的本地分支,并与指定的远程分支关联起来。若成功,将会在本地创建新分支cmm-wind,并自动切到cmm-wind上。
(3)但是,如果出现提示:fatal: Cannot update paths and switch to branch 'cmm-1' at the same time. Did you intend to checkout 'origin/cmm-1' which can not be resolved as commit?
表示拉取不成功,此时,我们需要先执行:git fetch,然后再执行该命令即可成功:git checkout -b cmm-wind origin/cmm-wind
方法二:
(1)直接从远程拉去一个本地没有的分支:
1)git checkout origin/APPService :在本地没有APPService分支的前提下,直接从远程拉取APPService分支到本地,执行完这个命令后,此时的分支暂时的,分支名是随机的数字。
2)git checkout -b APPService :然后从这个随机数字的分支名上切一个对应 APPService分支的本地分支,并且会自动关联起来。
或者:git checkout -b APPService origin/APPService
6、git log 的应用
(1) git lg:由于本地的“oh my zsh”作了一些配置,导致使用 git lg 即可很炫酷的看到分支的合并过程。
(2)git reflog:用来记录你每一次的操作命令,即使版本回退了,也可以找到历史的commit_ID,然后再进行版本恢复。
(3)git log 用于查询提交版本的历史记录,命令形式如下: git log [<options>] [<since>..<until>] [[--] <path>...]
这条命令有很多参数选项:--pretty=:使用其他格式显示历史提交信息,可选项有:oneline,short,medium,full,fuller,email,raw 以及 format:<string>,默认为medium。
-
不带参数:git log:会列出所有的历史记录,最近的排在最上方,显示提交对象的哈希值、作者、提交日期、提交说明。如果记录过多,则按↓、↑来控制显示。按 q 退出历史记录列表。
-
带参数: git log --oneline 或者 git log --pretty=oneline:一行显示,只显示哈希值和提交说明。
-
带参数:git log --pretty=format:"%H":控制显示的记录格式:"%H":提交对象(commit)的完整哈希字串、"%h":提交对象的简短哈希字串、"%s":提交说明、"%an":作者的名字、"%cd":提交日期。
7、git status 的应用
(1)git status:显示所有的变更文件。
(2.1)git diff:显示工作区和暂存区之间各个文件的差异。 当暂存区中没有文件时,git diff比较的是 工作区中的文件与上次提交到版本库中的文件。当暂存区中有文件时,git diff 比较的是 当前工作区中的文件与暂存区中的文件。
(2.2)git diff head:显示工作区和当前master分支最新一次commit之间的差异。
(2.3)git diff master:显示当前分支的工作区与本地master分支之间的差异。
(2.4)git diff commitID1 commitID2:显示提交commitID1和提交commitID2之间的差异。
(2.5)git diff fileName:显示当前分支工作区中的fileName文件被修改了哪些内容。
(2.6)git diff --stat:统计哪些文件发生了改变,有多少行产生了改动,并不会给出改动的具体内容 。 PS:http://www.softwhy.com/article-8401-1.html
(2.7)git show:查看最后一次的提交内容。
(2.8)git show commitId_A:查看A这次提交的所有修改。
(2.9)git show commitId_A fileName :查看A这次提交中的具体某个文件fileName的修改。
(3.1)git reset fileName:重置暂存区中的这个fileName文件的修改内容,使其与上一次的commit保持一致,但工作区不变。
(3.2)git reset --hard head^:重置工作区与暂存区,使其与上一次commit保持一致。
(3.3)git reset --hard head^^^^^^^^^^:(将最近10次的提交回滚)回退当前分支到之前提交的倒数第10个版本。
(3.4)git reset --hard head~10:将最近10次的提交回滚。
(3.5)git reset --hard commit_id:把当前分支的内容回滚到这个commit_id。
(4.1)git branch -d dev:删除本地dev分支。
(4.2)git branch -D dev:强制删除本地dev分支(因为dev分支内容还没有合入master主分支!)
(4.3)git push origin --delete dev:删除远程dev分支,危险命令!
(4.4)git push origin :dev:删除远程dev分支,危险命令!
(5.1)git push origin head -f :强制性的使本地的当前分支被提交到远程仓库中,并将本地分支与远程分支建立track联系。
(5.2)git push origin head -u :使本地的当前分支被提交到远程仓库中,并将本地分支与远程分支建立track联系。
(5.3)git fetch :基于当前分支,下载远程仓库的所有变动到本地。
(5.4)git pull:基于当前分支,从远程仓库拉取最新的代码到本地仓库。
(5.5)git pull origin master:强制从远程仓库拉取最新的代码到本地。
8、Git删除远程仓库的某次提交。git revert 和 git reset 的区别简要版。
(0)参考博客:Git删除远程仓库的某次提交:https://blog.csdn.net/qqxiaoqiang1573/article/details/68074847
【revert命令】
(1)假设现在有如下的提交记录:A <- B <- C <- D (说明:箭头方向表示parent节点,即A <- B 表示先提交了A,再提交了B)。
情况一:现在想回滚D,即不想要D了。
-
git revet commitId_D
-
执行命令后,会让你填写message(比如填写:不要D了),相当于1次commit,此时会多1次提交 E,如下:A <- B <- C <- D <- E(不要D了)。
-
于是,D 这次的提交就不会包含在E 中了,回滚成功。
-
最后,git push origin head -u
回到之前:A <- B <- C <- D
情况二:这次想回滚到C(注意是回滚到C,即 C和D都不要了)。
-
git revet commitId_B..head
-
注意这个hash的取值,是B的而不是C的commitHash。执行命令后,会让你填写message(比如填写:不要D了。不要C了),相当于2次commit,此时会多2次提交 E、F,如下:A <- B <- C <- D <- E(不要D了)<- F(不要C了)。
-
于是,C和D 这2次的提交就不会包含在F 中了,回滚成功。
-
最后,git push origin head -u
回到之前:A <- B <- C <- D
情况三:这次想回滚C(注意是回滚C,即 只有C不要了,D还是需要的)。
-
git revet commitId_C
-
注意这个hash的取值,是C的。执行命令后,会让你填写message(比如填写:不要C了),相当于1次commit,此时会多1次提交 E,如下:A <- B <- C <- D <- E(不要C了)。
-
于是,C 这1次的提交就不会包含在E 中了,回滚成功。
-
最后,git push origin head -u
注:git revert --quit:是指放弃这次revert。
【reset命令】
(1)假设现在有如下的提交记录:A <- B <- C <- D (说明:箭头方向表示parent节点,即A <- B 表示先提交了A,再提交了B)。
(2)git reset --hard commitId_B:注意这个hash的取值,是B的而不是C的commitHash。说明回滚到C,即C和D都不要了。
(3)此时,git push origin head -u 会出现和远程分支冲突,推不上去,这是因为本地head指针指向的版本要落后于远程分支的版本。
这时,如果你确认了是回滚到C,则可以直接使用 git push origin head -f 强制推送到远程,此时会删除远程的对应提交记录而变成:A <- B。
9、删除本地仓库有但是在远程仓库已经不存在的分支。
(1)git remote show origin:如下左图,可以查看到远程仓库的一些分支信息,以及本地仓库的一些信息。
(2)git remote prune origin:如右上图,其中 3.1, tc, xhl 三个分支在远程库已经不存在了(你之前从远程库拉取过,可能之后被其他人删除了,你用 Git branch -a 也是不能看出它们是否已被删除的),这时候我们可以删除本地库中这些相比较远程库中已经不存在的分支。
10、git 别名配置
(1)git config --global alias.st status
(2)git config --global alias.ci commit
(3)git config --global alias.df diff
(4)git config --global alias.co checkout
(5)git config --global alias.br branch
(6)git config --global core.ignorecase false:使git 命令不忽略大小写。
11、git pull 和 git fetch 的区别
【git pull 与 git fecth 的区别】: https://blog.csdn.net/weixin_41975655/article/details/82887273
(1)git删除文件:Git 删除文件
(2)git分支管理:Git 分支管理
12、批量删除本地分支
随着开发的需求越来越多,残留了许多无用本地分支,该怎么进行删除呢?
(1)逐一删除:git branch -d cmm-0815-sakos、git branch -D cmm-0815-sakos
(2)批量删除:git branch | grep '分支过滤关键字' | xargs git branch -D
13、git 强制覆盖本地代码
共需执行三条命令:git 强制覆盖本地:
(1)git fetch --all
(2)git reset --hard origin/master
(3)git pull
第一个是:拉取所有更新,不同步;
第二个是:本地代码同步线上最新版本(会覆盖本地所有与远程仓库上同名的文件);
第三个是:再更新一次(其实也可以不用,第二步命令做过了其实)。
14、git reflog
在Git中,总是有后悔药可以吃的。当你用 git reset --hard HEAD^
回退到 add distributed
版本时,再想恢复到 append GPL
,就必须找到append GPL
的commit ID。
Git提供了一个命令git reflog
用来记录你的每一次命令:
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file
终于舒了口气,从输出可知,append GPL
的commit id是1094adb
,现在,你又可以乘坐时光机回到未来了。
15、git 撤销修改
场景1:git checkout -- . 或者使用 git checkout -- fileName
场景2:第一步从暂存区中删除缓存文件:git reset head 或者使用 git reset head fileName;第二步从工作区中删除修改: git checkout -- . 或者使用 git checkout -- fileName
场景3:git reset --hard commitID 。另:git reflog 查看你的每一次命令。