Git主要操作详细用法

本文列举了Git中常用操作的详细用法,如果您不太了解Git,请先阅读《Git使用入门》。

原理图

+========+
|        |                                                         +---------+
|        |-----------------------------pull----------------------->|         |
|        |                                                         |         |
|        |                +==========+                             |         |
|        |                |          |                             |         |
| Rmote  |                |          |------------checkout-------->|Workspace|
|        |--fetch/clone-->|          |           +========+        |         |
|        |                |Repository|           |        |        |         |
|        |                |          |<--commit--| Index  |<--add--|         |
|        |<------push-----|          |           |        |        +---------+
+========+                +==========+           +========+

Pull操作

# 将origin这个版本库的代码更新到本地的master主支
$ git pull origin master

# 与merge类似,后面单独解释
$ git pull --rebase

Push操作

# 将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名)
# 如果该远程分支不存在,则会被新建
$ git push
$ git push origin

# 如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机
# 这样后面就可以不加任何参数使用git push
$ git push -u origin master

# 将所有本地分支都推送到origin主机
$ git push --all origin

# 将本地的master分支推送到origin主机的master分支
# 如果后者不存在,则会被新建
$ git push origin master

# 提交本地test分支作为远程的master分支
$ git push origin test:master

# 提交本地test分支作为远程的test分支
$ git push origin test:test 

# 删除远程分支test
$ git push origin :test
$ git push origin --delete test

# 强推分支,危险
$ git push -f
$ git push --force origin

标签操作

# 列出所有标签
$ git tag

# 列出1.3所有子版本
$ git tag -l 1.3.*

# 创建版本为1.3.1的标签并增加注释
$ git tag -a 1.3.1 -m "version 1.3.1"

# 查看指定版本的详细信息
$ git show 1.3.1

# 切换至标签
$ git checkout 1.3.1

# 将所有标签提交至远程
$ git push origin -tags

# 提交指定标签到远程
$ git push origin 1.3.1

# 获取远程分支
$ git fetch origin tag 1.3.1

# 删除本地标签
$ git tag -d 1.3.1

# 删除远程标签
$ git push origin :refs/tags/1.3.1

分支操作

# 列出本地已经存在的分支
$ git branch

# 列出远程分支
$ git branch -r

# 列出本地分支和远程分支
$ git branch -a

# 创建一个新的本地分支,只创建不切换
$ git branch newBranchName

# 重命名分支
# 如果newbranch名字分支已经存在,则需要使用-M强制重命名
# 否则,使用-m进行重命名
$ git branch -m | -M oldbranch newbranch

# 强制删除branchname分支
# -d选项只能删除已经被当前分支所合并过的分支
# 而要强制删除没有被合并过的分支,可以使用-D
$ git branch -d | -D branchname

# 删除远程branchname分支
$ git branch -d -r branchname 

# 查看当前分支与branchName分支之间的差异
$ git diff branchName

# 比较这1和2分支之间的差异
$ git diff branch1 branch2 

# 列出所有的树对象
$ git ls-tree -r branchName

# 检出分支
$ git checkout branchName

# 合并分支,将mi分支合并到当前分支当中去
$ git merge mi

# 推送本地分支
$ git push (远程仓库名字) (分支名) 

# 将本地mi分支推送到origin远程仓库的mi分支中去
$ git push orgin mi
$ git push origin mi:mi

# 获取的远程仓库中的分支
$ git fetch origin

# 在fetch操作下载好新的远程分支之后,你仍然无法在本地编辑该远程仓库中的分支。
# 如果要把该内容合并到当前分支,可以运行
$ git merge origin/mi

检出操作

检出命令是 git 最常用的命令之一,同时也是一个很危险的命令,因为这条命令会重写工作区。
检出命令的用法如下:

  • 用法一:git checkout [-q] [] [–] …
  • 用法二:git checkout []
  • 用法三:git checkout [-m] [[-b]–orphan] <new_branch>] [<start_point>]

上面列出的第一种用法和第二种用法的区别在于,第一种用法在命令中包含路径。为了避免路径和引用(或者提交ID)同名而发生冲突,可以在前用两个连续的短线(短号)作为分隔。
第一种用法的是可选项,如果省略则相当于从暂存区(index)进行检出。这和上一章的重置命令大不相同:重置的默认值是HEAD,而检出的默认值是暂存区。因此重置一般用于重置暂存区(除非使用–hard参数,否则不会重置工作区),而检出命令主要是覆盖工作区(如果不省略,也会替换暂存区中相应的文件)。

  • 第一种用法(包含了路径的用法)不会改变HEAD头指针,主要是用于指定版本的文件覆盖工作区中对应的文件。如果省略,则会用暂存区的文件覆盖工作区的文件,否则用指定提交中的文件覆盖暂存区中和工作区中对应的文件。
  • 第二种用法(不使用路径的用法)则会改变HEAD头指针。之所以后面的参数会写作,是因为只有HEAD切换到一个分支才可以对提交进行跟踪,否则仍然会进入“分离头指针”的状态。在“分离头指针”状态下的提交不能被引用关联到,从而可能丢失。所以用法二最主要的作用就是切换到分支。如果省略则相当于对工作区进行状态检查。
  • 第三种用法主要是创建和切换到新的分支(<new_branch>),新的分支从<start_point>指定的提交开始创建。新分支和我们熟悉的master分支没有什么实质的不同,都是在refs/heads命名空间下的引用。
# 检出分支branchName
$ git checkout branchName

# 汇总显示工作区、暂存区与HEAD的差异
$ git checkout
$ git checkout HEAD

# 用暂存区中filename文件来覆盖工作区中的filename文件。
# 相当于取消自上次执行git add filename以来(如果执行过)的本地修改。
$ git checkout -- filename

# 用branch所指向的提交中filename替换暂存区和工作区中相应的文件
# 注意会将暂存区和工作区中的filename文件直接覆盖
# 维持HEAD的指向不变
$ git checkout branch -- filename

# 暂存区的所有文件直接覆盖本地文件,无确认,危险
$ git checkout -- .
$ git checkout .

综合操作实例

# 更新单个或指定的文件
$ git fetch
$ git checkout origin/master -- app/index.html

# 让单个文件回退到指定的版本
$ git log app/index.html #  得到对应版本号
$ git reset 6e90aaff5dae2689663e590f473a57752c0d2eff app/index.html

# 拉的时候冲突处理
$ git fetch
$ git merge

# 新加远程仓库
$ git remote add origin https://github.com/alei817927/jmap-plus-converter.git

# 切换到新的仓库
# 先查看remote仓库列表
$ git remote -v
# 假设你的remote是origin,用git remote set_url 更换地址
$ git remote set-url origin https://github.com/alei817927/jmap-plus-converter.git

# 删除远程仓库
$ git remote rm repoName
# 删除cache里面的指定文件
$ git rm -r --cached path/file

# 不同阶段设置默认跟踪远程分支的方式
$ git push -u origin branchName
# 或者
$ git checkout -b localBranchName origin/branchName
# 或者
$ git checkout --track origin/branchName
# 或者
$ git branch --track localBranchName origin/branchName
# 或者(新版本中 --set-upstream 已经过时,一般使用 --set-upstream-to 代替)
$ git branch --set-upstream-to localBranchName origin/branchName

发表评论