主要
git commit
- 作用:保存一次提交
- 说明:git仓库中的提交记录保存的是你目录下所有文件的快照,类似于复制粘贴,但比复制粘贴优雅,会将当前版本与仓库中上一个版本的差异打包到一起作为一次提交。
- 参数:
- -m 添加提交信息
- -am
git add .
和git commit -m ""
的组合写法 - –amend
- 例子:
git commit -m "一次提交记录"
git branch
- 作用:创建新分支
- 说明:
- 简单的指向某个记录,不会造成存储和内存上的开销。
- 分支和提交记录关系是,基于这个提交以及它所有的父提交进行的新工作。
- 参数:
- -f 强制移动分支
- -a 列出所有分支,包括远程分支和本地分支
- -D branchName,删除本地分支
- 例子:
git branch newimage
创建newimage分支git branch -f master HEAD~3
将 master 分支强制指向 HEAD 的第 3 级父提交.不必在master分支上执行此操作,在任何分支上执行都可以git branch bugWork HEAD~3
将HEAD 的第 3 级父提交标记为bugWork分支
- 相关命令:
git checkout -b newimage
创建并切换到分支newimage;git checkout -
切换到前一次分支
git merge
- 作用: 合并两个分支
- 说明: 合并是会产生一个特殊的提交记录,有两个父节点,会把两个父节点及其祖先都包含进来。
- 参数:
- 例子: 在master分支上执行
git merge bugFix
,意味着将bugFix分支的代码合并到了master上,master拥有了代码库的所有修改 - 相关命令:
git commit -am ""
解决完冲突后提交
git rebase
- 作用: 合并分支
- 说明:
- 取出一系列提交记录,然后在另一个地方逐个放进去,相对于merge优势是可以创造更线性的提交历史
- Rebase优点 使你的提交树变得很干净, 所有的提交都在一条线上
- Rebase缺点 修改了提交树的历史
- 参数:
- 例子:
- 在bugFix分支上执行
git rebase master
,将bugFix分支的工作直接移到master分支上,移动后两个分支功能看起来像是顺序开发的。 git rebase master bugFix
等于git checkout bugFix ;git rebase master
- 在bugFix分支上执行
- 相关命令:
git add .
解决一次冲突后添加;git rebase --continue
解决一次冲突后继续rebasegit rebase --skip
跳过这个提交git rebase --abort
终止并回到之前的状态git am --show-current-patch
git checkout
- 作用: 分离HEAD
- 相关概念:
- HEAD 当前检出记录的符号引用,指向正在工作的提交记录。
- 使用
^
向上移动1个提交记录 - 使用
~<num>
向上移动多个提交记录,如~3
- 说明: 在提交树上移动
- 参数:
- 例子:
git chekcout master^^
切换到master的第二个父节点 - 相关命令:
cat .git/HEAD
查看 HEAD 指向,git symbolic-ref HEAD
如果head指向的是一个引用,用改命令查看git log
查看提交记录,git log --graph
以图表的形式查看提交记录
git reset
- 作用: 撤销变更
- 说明:
- 通过把分支记录回退几个提交记录来实现撤销改动,原来的指向提交记录跟没有提交过一样。
- 在reset后,所做的变更还在,但是处于未加入暂存区状态。
- 对大家一起使用的远程分支无效。
- 参数:
- 例子:
git reset HEAD^
撤销本次commit,本地代码不会改变 - 相关命令:
git revert
- 作用: 撤销更改并分享给别人
- 说明: 撤销提交后会多一个提交,新提交和你要撤销到的提交状态是相同的。revert后可以直接推送到远程库
- 参数:
- 例子:
git revert HEAD
撤销本次提交,本地代码会改变 - 相关命令:
git cherry-pick
- 作用: 整理提交记录
- 说明: 将一些提交复制到当前所在的位置(HEAD)下,知道所需的提交记录,用cherry-pick比较好
- 参数:
- 例子:
git cherry-pick c2 c4
将c2 c4挑出来放到当前分支下 - 相关命令:
git rebase -i
- 作用: 交互式的 rebase 带参数–interactive,简写为 -i
- 说明: 从一系列的提交记录中找到想要的记录,需要去选择你所需要的提交记录
- 参数:
- 例子:
git rebase -i HEAD~2
- 相关命令:
git tag
- 作用: 指向某个提交记录的标识
- 说明:
- 将某个特定的提交命名为里程碑,然后就可以像分支一样引用了
- 它们并不会随着新的提交而移动。
- 你也不能检出到某个标签上面进行修改提交,它就像是提交树上的一个锚点,标识了某个特定的位置。
- 在tag上进行的修改提交。会使你的改动作为一次新的提交,而tag上的内容不会变
- 参数:
- 例子:
git tag v1 c1
命名提交记录c1 v1,不指定提交记录,git会用HEAD所指向的位置。 - 相关命令:
git describe ref
- 作用:
- 说明:
- ref 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(HEAD)
- 输出tag_numCommits_hash
- tag 表示的是离 ref 最近的标签
- numCommits 是表示这个 ref 与 tag 相差有多少个提交记录
- hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。
- 参数:
- 例子:
git describe --tags
列出离当前位置最近的tag
- 相关命令:
^num
- 作用: 指定合并提交的某个父节点
- 说明: Git 默认选择合并提交的是“第一个”父提交,在操作符
^
后跟一个数字可以改变这一默认行为。 - 参数:
- 例子:
git checkout master^
HEAD分离到master正上方的提价记录(默认方式)git checkout master^2
HEAD分离到master另一个父提交记录git checkout HEAD~^2~2
HEAD分离到当前位置的父节点的另一方父节点的祖父节点上
- 相关命令:
远程
git clone url
- 作用: 在本地创建一个远程仓库的拷贝
- 说明: 远程仓库指你的仓库在另个一台计算机上的拷贝。可以通过因特网与这台计算机通信 —— 也就是增加或是获取提交记录
git remote
git remote add [shortname] [url]:
- 作用:查看远程仓库
- 说明:
- 参数:
- 不带参数,列出已经存在的远程分支
- -v | --verbose 列出详细信息,在每一个名字后面列出其远程url
- 例子:
git remote add o1 uri
添加一个远程仓储,简称为o1
remote name / branch name
- 作用:远程分支
- 说明:
- 远程分支反映了远程仓库(在你上次和它通信时)的状态
- 远程分支有一个特别的属性,在你检出时自动进入分离 HEAD 状态。Git 这么做是出于不能直接在这些分支上进行操作的原因, 你必须在别的地方完成你的工作, (更新了远程分支之后)再用远程分享你的工作成果。
- 远程仓库默认名为origin
git fetch
- 作用: 将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态
- 说明:
- 从远程仓库下载本地仓库中远程分支缺失的提交记录
- 更新本地的远程分支指针(如 o/master)
- 并不会改变你本地仓库的状态。它不会更新你的本地分支,也不会修改你磁盘上的文件
- 例子:
git fetch
下载所有的提交记录到本地的各个远程分支……
git pull
- 作用: 将远程仓库的变化更新到本地
- 说明:
- 先抓取更新再合并到本地分支
git fetch;git merge origin/master
等价git pull
- 参数: --rebase
git push
- 作用: 你的变更上传到指定的远程仓库,并在远程仓库上合并你的新提交记录
- 说明:
- 不带任何参数时的行为与 Git的 push.default 配置有关
git fetch;git merge origin/master
等价git pull
这情况(历史偏离)有许多的不确定性,Git 是不会允许你 push 变更的。实际上它会强制你先合并远程最新的代码,然后才能分享你的工作。
远程跟踪
- master 和 o/master 的关联关系就是由分支的“remote tracking”属性决定的,你克隆仓库的时候, Git 就自动帮你把这个属性设置好了。
在你clone 的时候会看到local branch "master" set to track remote branch "o/master"
- 自己指定分支
- 方法一
git checkout -b totallyNotMaster o/master
创建一个名为 totallyNotMaster 的分支,它跟踪远程分支 o/master - 方法二
git branch -u o/master foo
这样foo 就会跟踪 o/master 了。如果当前就在 foo 分支上, 还可以省略 foo
- 方法一
git push remote place
- 作用: 推送到远程remote的place分支
- 说明: 不用切换到指定分支,推送指定分支到远程
git push origin source:destination
- 说明:指定了独立的来源source和目的地destination
- 例子:
git push origin foo^:master
退送foo^位置的变更到远程仓库的master分支git push origin master:newBranch
目标分支不存在,git会根据你所提供的名称帮你创建这个分支
git fetch remote place
- 说明: 和git push 方向相反,从远程到本地
- 例子:
git fetch origin foo
到远程仓库的 foo 分支上,然后获取所有本地不存在的提交,放到本地的 o/foo 上
git fetch remote source:destination
* source:远程仓储的位置
* destination 才是要放置提交的本地仓库的位置
- 说明:
- 直接更新本地分支,你不能在当前检出的分支上干这个事,但是其它分支是可以的。
- 理论上虽然行的通,但开发人员很少这么做。我在这里介绍它主要是为了从概念上说明 fetch 和 push 的相似性,只是方向相反罢了
古怪的source
git push origin :side
push空source会删除远程仓库中的分支
git fetch origin :bugFix
fetch空source会在本地创建一个分支
git pull remote place
- 说明: 唯一关注的是提交最终合并到哪里
等效命令:
git pull origin foo
和git fetch origin foo;git merge o/foo
git pull origin bar~1:bugFix
和git fetch origin bar~1:bugFix; git merge bugFix
- 例子:
- 在本地的bar分支执行
git pull origin master
,将 o/master merge 到我们的检出位置,无论我们当前检出的位置是哪。 git pull origin master:foo
在本地创建了一个叫 foo 的分支,从远程仓库中的 master 分支中下载提交记录,并合并到 foo,然后再 merge 到我们的当前检出的分支 bar 上
- 在本地的bar分支执行
冲突解决
如果远程分支v1 在合并到 v2 时出现冲突。
则在本地的v2 分支merge v1 分支,然后将本地v2分支push到远程。
gitignore
在文件是unchecked状态时可以直接在.gitignore
文件中加上对该文件的忽略即可成功。但是如果文件已经被git管理,此时要忽略改文件就需要先修改.gitignore
文件,然后执行如下命令:
git update-index --assume src/main/webapp/META-INF/context.xml
git update-index --assume-unchanged /path/to/file #忽略跟踪
git update-index --no-assume-unchanged /path/to/file #恢复跟踪