Git-2.常用命令及相关参数

相关材料

官方文档
官方文档-中文

常用命令

仓库的初始化

本地创建新的仓库

1
2
3
4
5
6
7
8
9
10
11
12
# 新建一个git仓库,运行完后会在当前目录下生成一个.git 目录
git init

# 将本地仓库与远程仓库进行关联
git remote add origin git@github.com:YZ/helloTest.git

# 先将关联后的github仓库中的代码pull下来
git pull origin master

# 将最新的修改推送到远程仓库 将本地仓库的文件推送到远程仓库
git push -u origin master
# 第一次使用加上了-u参数,是推送内容并关联分支

从远程仓库中拉取一个仓库到本地

完成秘钥配置后,可以将gitlab上的项目下载到本地进行部署

1
git clone remote-repertor(https://github.com/libgit2/libgit2) local—repertory(可以省了默认保持原仓库名称)

完成项目到本地的传输后,可以进行相应的安装或使用,git clone仅能用于将远程项目初始化到本地(从无到有)不支持后续的更新同步

下载更新

作为多人版本协作,会有不同的人同时对项目进行更新,所以有时候会有需求将他人的更新同步到本地流程中,使用 git pull命令

  • 正规流程
1
2
3
4
5
6
7
8
9
git status(查看本地分支文件信息,确保更新时不产生冲突)

git checkout – [file name] (若文件有修改,可以还原到最初状态; 若文件需要更新到服务器上,应该先merge到服务器,再更新到本地)

git branch(查看当前分支情况)

git checkout remote branch (若分支为本地分支,则需切换到服务器的远程分支)

git pull
  • 快速流程
1
2
#上面是比较安全的做法,如果你可以确定什么都没有改过只是更新本地代码
git pull (一句命令搞定)

版本管理

提交更新

提交更新主要分三个部分,1,更新提交到本地暂存区;2.更新到本地版本库;3.推送更新。

1
2
3
4
5
6
7
8
git add file.name  #将更新的文件提交到本地的缓存区;
git add . # 提交目录下所有更新
git rm file.name # 把目录的文件从跟踪中移除
git status # 查看当前提交到缓存区的所有更新
git commit -m "version description" #将缓存区的内容更新到本地的版本库;
git commit --amend -m "新的提交信息" # 更新已经提交过的commit内容
git commit -m "XXXXXXX close #1" #提交更改,并关闭对应的issue #后面跟issue_id
git push #将本地最新的版本推送到远程仓库。如果是clone下来的仓库,会推送到原下载链接所在的仓库。

添加tag

像其他版本控制系统(VCS)一样,Git 可以给仓库历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点( v1.0 、 v2.0 等等)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#列出标签
git tag

# 例如符合条件的标签
$ git tag -l "v1.8.5*"
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3

#创建标签,其中 -m可选,版本校验值缺省时默认是当前版本
git tag -a v1.4 -m "my version 1.4" ca82a6dff817ec66f44342007202690a93763949

# 共享标签, 标签在推送时,默认是不会进行推送的,需要进行显式的提交
git push origin v1.5 # 推送指定的tag版本(v1.5)
git push origin --tags # 推送全部tags

查看本地的版本记录

1
2
3
4
5
# 查看版本更新日志
$ git log

# 只显示每个版本改动的文件名称
$ git log --name-only

比较两个版本之间的区别

1
2
3
4
5
6
7
8
# 查看任意两个版本之间的改动:
$ git diff 版本号码1 版本号码2

# 查看两个提交版本id修改了那些文件,可以使用
$ git diff commit-id1 commit-id2 --stat

#比较两个版本号码的src 文件夹的差异
$ git diff 版本号码1 版本号码2 src

对本地版本进行更改

1
2
3
4
git reset gitversion filename# 撤销提交缓存区的偶作
git reset --hard gitversion # 还原本地流程到之前的gitversion版本,放弃本地的后续版本
git reset --hard HEAD^ #回退到上一个版本("^" 代表回退的版本数,两个版本用"^^"
git reset --hard HEAD~50#还原git到指定版本

–hard 不保存所有变更
–soft 保留表更且变更内容处于staged
–mixed 保留biang且变更内容处于modified(默认)

对特定文件进行管理 - 恢复修改的文件

  • 只修改了文件,没进行任何git操作

    1
    2
    # 只是修改了文件,没有任何 git 操作,直接一个命令就可回退:
    $ git checkout -- aaa.txt # aaa.txt为文件名
  • 修改了文件,并提交到暂存区(即编辑之后,gitadd但没有 git commit -m ….)

    1
    2
    3
    $ git log --oneline    # 可以省略
    $ git reset HEAD # 回退到当前版本
    $ git checkout -- aaa.txt # aaa.txt为文件名
  • 修改了文件,并提交到仓库区(即编辑之后,gitadd和 git commit -m ….)

    1
    2
    3
    $ git log --oneline    # 可以省略
    $ git reset HEAD^ # 回退到上一个版本
    $ git checkout -- aaa.txt # aaa.txt为文件名

分支管理

!image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#列出分支命令:
git branch

#创建分支命令:
git branch (branchname)

#切换分支命令:
git checkout (branchname)

#创建并切换该分支
git checkout -b <name>

#合并分支命令:
git merge newtest # 将newtest分支合并到当前分支

#重命名分支
git branch -m/-M <oldname> <newname>

#删除分支命令:
git branch -d (branchname)

#恢复的删除分支
git branch <name> <删除分支的commitID>

比较两个分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 显示出branch1和branch2中差异的部分
git diff branch1 branch2 --stat

#显示指定文件的详细差异
git diff branch1 branch2 具体文件路径

#显示出所有有差异的文件的详细差异
git diff branch1 branch2

#查看branch1分支有,而branch2中没有的log
git log branch1 ^branch2

#查看branch2中比branch1中多提交了哪些内容
git log branch1..branch2
#注意,列出来的是两个点后边(此处即dev)多提交的内容。

#不知道谁提交的多谁提交的少,单纯想知道有是吗不一样
git log branch1...branch2

#在上述情况下,在显示出没个提交是在哪个分支上
git log --lefg-right branch1...branch2
#注意 commit 后面的箭头,根据我们在 –left-right branch1…branch2 的顺序,左箭头 < 表示是 branch1 的,右箭头 > 表示是branch2的。

远程仓库操作

1
2
3
4
5
6
7
8
9
10
11
12
13
#克隆一个已有的远程git仓库
git clone https://github.com/lh3/wgsim.git

#把一个已有的本地仓库与远程仓库关联起来。
git remote add origin https://github.com/lh3/wgsim.git

#可以把本地库的所有内容推送到远程库master/dev分支
git push origin master/ git push origin dev

#将远程 origin 的 master 分支拉取过来,与本地的test分支合并。
git pull origin master:test

git pull = git fetch + git merge

Patching

有记录的进行版本回退。

1
2
3
4
# Given one or more existing commits, revert the changes that the related patches introduce, and record some new commits that record them.

git revert
当发生一次错误的提交以后,可以进行版本的还原(同时保留错误的提交记录)

merge

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
git merge
--edit和-e # 用于在成功合并、提交前调用编辑器来进一步编辑自动生成的合并信息。因此使用者能够进一步解释和判断合并的结果。
--no-edit # 参数能够用于接受自动合并的信息(通常情况下并不鼓励这样做)。
--ff # 是指fast-forward命令。当使用fast-forward模式进行合并时,将不会创造一个新的commit节点。默认情况下,git-merge采用fast-forward模式。
--ff-only # 除非当前HEAD节点已经up-to-date(更新指向到最新节点)或者能够使用fast-forward模式进行合并,否则的话将拒绝合并,并返回一个失败状态。
--no-ff命令 # 即使可以使用fast-forward模式,也要创建一个新的合并节点。这是当git merge在合并一个tag时的默认行为。

--log[=<n>]# 将在合并提交时,除了含有分支名以外,还将含有最多n个被合并commit节点的日志信息。
--no-log # 并不会列出该信息。

--stat # 参数将会在合并结果的末端显示文件差异的状态。文件差异的状态也可以在git配置文件中的merge.stat配置。
-n/--no-stat # 参数将不会显示该信息。

--squash # 当一个合并发生时,从当前分支和对方分支的共同祖先节点之后的对方分支节点,一直到对方分支的顶部节点将会压缩在一起,使用者可以经过审视后进行提交,产生一个新的节点。开发者可能在本地提交了大量且无意义的节点,当需要合并到develop分支时,可能仅仅需要用一个新的节点来表示这一长串节点的修改内容,这时--squash命令将会发挥作用。如果功能分支的多次提交并不是琐碎而都是有意义的,使用--no-ff命令更为合适。

-q和 --quiet # 静默操作,不显示合并进度信息。
--no-commit # merge命令默认会将分支合并后,直接进行commit提交,有时候我们可能会先核查相关的文件变动不想立即提交可以选择该参数。完成调整后再使用commit单独提交。
git merge --abort # 在合并出现冲突时使用,放弃合并过程,重建合并前的状态

git merge

-------------本文结束感谢您的阅读-------------