Git学习笔记
1. 命令记录
-
git commit 用于提交记录,将修改的文件快照提交到本地仓库
#提交记录的命令 git commit -m "提交注释"
-
git branch 用于创建和管理分支,git分支是非常轻量的,不会造成额外的存储或内存开销
#创建分支 分支名称--newBranch 新建的分支指向最新的一次提交记录,即最新的commit git branch <newBranch> #分支切换,有多条分支的时候控制切换,git命令只会操作当前分支 git checkout master #同时创建分支并切换到该分支 git checkout -b <newBransh>
-
git merge 合并分支的方式一
#合并newBranch到当前分支,效果相当于当前分支多一次commit且该commit包含这两个分支的所有提交,但newBranch不包含当前分支的记录 git merge <newBranch>
-
git rebase 合并分支的方式二
# 将当前分支添加到的newBranch分支的提交记录后,之后在提交一次当前分支,当前分支就包含所有的提交 git rebase <newBranch>
-
分离HEAD
HEAD是一个对当前检出(checkout)做记录的符号,指向当前分支的最近一次提交
#查看HEAD指向 cat .git/HEAD #HEAD指向引用的查看方式 git sysbolic-ref HEAD
而分离的HEAD就是让其指向一次具体的提交记录而不是分支名
#C1表示一次具体的提交记录,以下代码执行之前的状态 HEAD->master->C1 git checkout C1 #C1在git中往往是一串hash值(基于SHA-1,共40位),查看commit hash git log
-
相对引用
因为commit hash过长不方便使用,因此git支持仅提供能够唯一标识一次提交的hash前几个值就可以了,但标识每次记录确实不方便,也就需要相对引用的存在了,例如^表示向上移动一个提交,~3表示向上移动3个记录
#HEAD向上移动3次提交 git checkout master^^^ git checkout master~3 #使用-f选项使分支指向另一个提交 git branch -f master HEAD~3
-
git reset git revert撤销变更
#撤销一次提交,但这次所做的更改还在,只是没有加入暂存区状态 git reset HEAD^ #reset对远程分支无效,需要使用revert,其实多push一次,提交的内容刚好取消上一次的提交,如果有^会撤销倒数第二次提交 git revert HEAD
-
git cherry-pick整理提交记录
#将一些提交复制到当前所在的位置(HEAD)下面(处于上游的无法操作) git cherry-pick commit1 commit2
-
交互式rebase 适用于你不清楚自己需要的提交hash
交互式rebase指的是使用带参数 --interactive(简称 -i)的rebase命令
#修改当前分支4次提交内的提交顺序 git rebase -i HEAD~4
2. 使用技巧
-
本地栈式提交
当修改一些棘手的bug时,可能会使用一些打印之类的语句,但这些提交并不需要同步到远程服务器,因此可以使用git rebase -i和给i他cherry-pinck来只push最终解决问题的那一次提交
-
提交的技巧
有时候需要修改一以前的某一次提交中的一些问题,为了实现这样的目标,需要先对多次提交进行排序,有修改需要的提交放到最近,完成修改以后再把他修改回之前的顺序。
git rebase -i HEAD~3#将要修改的提交移动到最前面 git commit --amend#使用amend追加修改 git rebase -i HEAD~3#提交顺序移动回去 git checkout master git rebase <changeBranch>#最后将master移动到修改的最前面 #该方法可能引起冲突 #方法2 git checkout master git rebase <changeBranch> git commit --amend git cherry-pick <Branch1> <Branch2> ...
-
git tags不同于经常变化的分支,可以永久的将某提交命名,之后像分支一样被使用,不能被检出修改提交
#建立一个标签,表示版本号version1.0.1,如果不指定提交,则用HEAD git tag vsersion1.0.1 <commit1>
-
git describe描述最近的tag
#查找距离一个提交记录最近的标签,ref可以是任何能被识别成一个记录的引用,返回<tag>_<numCommits>_g<hash>,表示标签,距离多少次提交,ref所表示的提交的#hash的前几位 git describe <ref>
-
HEAD^n用来表示多个父节点时如何选择
#选择父节点的第二个提交,不写默认第一个 git checkout HEAD^2
3.远程仓库
-
git clone复制远程仓副本到本地
#复制远程仓库(url)的分支到本地 #clone后自动进入HEAD分离状态,即使提交后orign/master也不会更新,只有远程仓库中相应的分支更新了才会更新 git clone -b <yourBranch> <url> #git fetch类似于下载更新内容,并不会影响本地状态 git fetch <远程主机名> <branch> #git pull 相当于 git fetch 和git merge 也可以使用git rebase/git cherry-pick实现类似效果 git pull <远程主机名> <远程分支名>:<本地分支名>#等价于 git fetch origin git rebase origin/master
-
git push将你的变更上传到远程服务器
如果git push不携带任何参数,其上传行为与git的push.default配置有关,其默认值与git版本有关
1.nothing
不推送任何东西并有错误提示,除非明确指定分支引用规格。强制使用分支引用规格来避免可能潜在的错误。
2.current
推送当前分支到接收端名字相同的分支。
3.upstream
推送当前分支到上游,这个模式只适用于推送到与拉取数据相同的仓库,比如中央工作仓库流程模式
4.simple
在中央仓库工作流程模式下,拒绝推送到上游与本地分支名字不同的分支。也就是只有本地分支名和上游分支名字一致才可以推送
#上传修改到远程,参数可以不带 git push <branch>
-
追踪远程仓库
#将指定的分支追踪到远程仓库的master分支 命令1 git checkout -b <yourbranch> <origin/master> #命令2 如果是当前分支,可以省略<yourbranch> git branch -u origin/master <yourbranch>
-
git push参数
#push完整的命令 远程名 提交的分支,问题是此时的place在远程和本地同名,远程没有的话会创建,本地没有的话...(废话,命令错误) git push <remote> <place> #本地和远程分支名不同的提交 git push origin <source>:<destination>
-
git fetch参数
参数类似于git push ,只是执行方向相反,下载与上传
#fetch完整命令,同样的place可以是source:destination命令,但不建议这样做,因为更新远程分支到本地但origin/branch不更新容易让人迷惑 git fetch <remote> <place> #source可以是空值,如果为空,push可以删除远程的destination分支,fetch会在本地新建destination分支
-
git pull参数
git pull可以看做是git fetch 和git merge的缩写,因此git pull的参数效果可以从git fetch和git merge的运行结果进行猜测
#以下是两组git中的等效命令 之所以mergeorigin/foo是因为fetch不改变本地状态,只是下载foo新的提交,并移动了origin/foo位置到最新提交 git pull origin foo git fetch origin foo;git merge origin/foo; #第二组 git pull origin bar~1:bugFix git fetch origin bar~1;git merge bugFix
以上内容根据 https://oschina.gitee.io/learn-git-branching/ 和其他网页整理,其他网页网址我也没记住…