git merge用法_git学习 v2.0 深度学习

实用命令

git ls-files                          #列出缓存区的文件
git cat-file <-p|-e|-t|-s> <类型> #( 可以是其中之一:blob、tree、commit、tag)查看提交的信息 eg.git cat-file -p HEAD
git ls-tree <树对象> #列举仓库/树中的文件

# 例子
git cat-file -p HEAD #显示了 HEAD 快照实际的目录列表,以及其中每个文件的 SHA-1 校验 和

git配置

git的配置文件:

可以通过config文件配置用户名,邮件,diff工具,写有排除列表的文件路径,merge工具等。

  • 电脑所有用户
    在配置git config时带上 --system 选项,配置文件存储在/etc/gitconfig,那么它就会读写该文件中的配置变量。

  • 当前用户
    如果只针对当前用户,配置文件存储在~/.gitconfig中(或者~/.config/git/config)可以使用--global 选项让 Git 读写此文件,这会对你系统上 所有 的仓库生效。

  • 针对当前仓库
    当前git目录下的.git/config。可以传递--local选项让 Git 强制读写此文件,(默认情况下用的就是它)

git会查找读取配置文件,首先在当前git目录下,然后在当前用户下,最后在系统用户下。覆盖级别依次递减。

我的~/.gitconfig内容

[filter "lfs"]
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process
required = true
[user]
name = superqun
email = superqun@qq.com
[core]
excludesfile = /Users/chenchaoqun/.gitignore_global
[difftool "sourcetree"]
cmd = opendiff \"$LOCAL\" \"$REMOTE\"
path =
[mergetool "sourcetree"]
cmd = /Applications/Sourcetree.app/Contents/Resources/opendiff-w.sh \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
trustExitCode = true
[commit]
template = /Users/chenchaoqun/.stCommitMsg

获取帮助 @ help

三种方法,获取完整的本地帮助:

  • git help

  • git --help

  • man git-

简明的帮助:git -h

获取git仓库

新建初始化仓库 @ init

该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件。但是,在这个时候,我们仅仅是做了一个初始化的操作,的项目里的文件还没有被跟踪。可用通过git add 和git commit进行仓库构建。

git init            #在当前目录下新建仓库

克隆已有仓库 @ clone

可以通过git clone克隆一个已经存在的git仓库的完整拷贝。拷贝会在你当前文件夹下新建一个仓库名称的文件夹然后把仓库内容完整拷贝进去。

# 用法
git clone <选项> -- <仓库> <路径>

# 参数
-l, --local # 从本地仓库克隆
--single-branch # 只克隆一个分支、HEAD 或 --branch

# 例子
git clone https://github.com/libgit2/libgit2
#在当前文件夹下创建一个名为libgit2 的目录并创建一个初始仓库
git clone https://github.com/libgit2/libgit2 mylibgit
#在mylibgit文件夹下创建
git clone git@gitee.com:veryqun/super_test.git /Users/chenchaoqun/SUPER_QUN/git_test/hhaah
#在制定路径下创建

记录更新

文件状态 @ status

在对本地文件操作后,可以通过git status查看文件状态

# 用法
git status <参数>

# 参数
-s #以简洁的格式显示状态
--long #以长格式显示状态(默认)

文件状态:

?? 4.txt: 工作区新添加文件,未追踪A 4.txt: 对文件追踪,添加到缓存区。AM 4.txt: 在工作区对添加到缓存区的文件进行修改,还未提交时状态

跟踪新文件 @ add

对于新创建的文件,文件是处于untrack状态,可以使用命令 git add 开始跟踪一个文件。

# 用法
git add <参数>

# 参数
-v,--verbose # 冗长输出,如果添加了新文件会返回添加信息。
-f, --force # 允许添加忽略的文件
-u, --update # 更新已跟踪的文件
-A, --all # 添加所有改变的已跟踪文件和未跟踪文件

忽略文件

对于不希望加入跟踪列表的,可以在仓库目录或者仓库中资源文件夹下建立.gitignore文件,可以在文件中输入要忽略的文件。支持正则表达。

# 例如
*.[oa] #忽略所有以 .o 或 .a 结尾的文件
*~ #忽略所有名字以波浪符(~)结尾的文件
!lib.a #即使规定了忽略*.a 但是对lib.a除外
/TODO #忽略当前目录下的TODO文件 而对于其他目录下的TODO则不忽略
build/ #忽略任何目录下名为 build 的文件夹
doc/*.txt #忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/**/*.pdf #忽略 doc/ 目录及其所有子目录下的 .pdf 文件

文件比对 @ diff

通过git status可以查看哪些文件被修改而没有提交,或者提交后修改。可以通过git diff来具体查看文件哪里不同。

# 用法
git diff <参数> <file_1> <file_3>

# 参数
--cached # 比对已暂存文件与最后一次提交的文件差异

查看工作区和缓存区的文件差异:git diff
直接使用git diff查看工作区和缓存区的文件差异,会列出所有差异的文件和差异内容。可以指定文件查看特定文件差异。
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。也就是修改之后还没有暂存起来的变化内容。

比较暂存文件与最后一次提交的文件差异:git diff --cached

提交更新 @ commit

在确定后缓存区文件正确后可以使用git commit进行提交。提交时候加上参数-m来对本次提交进行注释

# 用法
git commit [<选项>] [--] <路径规格>...

# 参数
-a,--all #提交所有改动的文件,使得不用git add追踪文件

-q, --quiet # 提交成功后不显示概述信息
-m,--message <说明> # 提交说明
-o, --only # 只提交指定的文件
--dry-run # 显示将要提交的内容

# 例子
git commit -m "第二次提交_22:10"
git commit -a -m "第二次提交_22:10" #不用单独使用git add

移除文件 @ rm

  • 工作区移除,直接使用rm 命令移除文件,但是如果文件已经提交,移除后还需要从缓存区删除

  • 使用git rm进行移除缓存区的文件。

    • 如果工作区文件未删除,直接删除缓存区,会提示错误。应该先删除工作区文件,再删除缓存区文件。

    • 如果本地文件和缓存区文件一致,使用git rm --cached 删除缓存区文件而保留工作区文件(适合删除不小心添加不必要的文件到缓存区但是还没提交)。

    • 如果要删除缓存区和工作区有差异的文件,或强制删除工作区与暂存区的文件,则必须使用强制删除选项 git rm -f

  • git支持通配符* 但是需要用\转义。eg.git rm log/\*.log(删除 log/ 目录下扩展名为 .log 的所有文件)

# 用法
git rm [<选项>] [--] <文件>...

# 参数
-n, --dry-run #演习
--cached #只从索引区删除
-f, --force #忽略文件更新状态检查
-r #允许递归删除

# 例子
rm 23_20.txt & git rm 23_20.txt # 在本地和缓存区删除文件
rm -f a.txt #强制删除本地和缓存区文件

移动文件/重命名 @ mv

对于已经提交过仓库,如果需要对文件重命名,可以使用git mv 来实现工作区和缓存区的重命名。

# 例子
git mv <old_name > <new_name> #对工作区和缓存区文件重命名

查看提交历史 @ log

git 可以提供提交历史的信息。使用git log命令查看提交历史等诸多详细信息。

git log 输出格式


git log
# 按时间先后顺序列出所有的提交,命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明


git log -p <-n>
git log -p -2 #例子
#显示n次最近提交的日志,详细记录每次提交的差异。如果不指定n则默认全部展示 eg.


git log --stat
#看到每次提交的简略统计信息展示出了git log提供信息外,还展示了被修改过的文件、有多少文件被修改了以及被修改过 的文件的哪些行被移除或是添加了。


git log --oneline
# 将每个提交放在一行显示,只展示commiID和 提交信息 以及HEAD指针指向


git log --pretty=<参数>
git log --pretty=oneline #例子
git log --pretty=format[选项内容]
git log --pretty=format%H #例子 只展示每次提交的完整哈希值
# 可以自己选择展示信息的内容


git log --oneline --graph
# 形象展示分支合并信息
# 例子
$ git log --stat

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700

first commit

README | 6 ++++++
Rakefile | 23 +++++++++++++++++++++++
lib/simplegit.rb | 25 +++++++++++++++++++++++++
3 files changed, 54 insertions(+)

附:
git log --pretty=format 常用的选项dc2365132026dcdfc058dbcea34a87db.png
附:
git log 的常用选项1c4a83e892abd6f1351323aa3781a9d0.png

git log的输出过滤

git log输出格式确定后,可以通过限制最近n次提交、时间段、提交者等信息进行输出限定。
例如类似 --since 和 --until 这种按照时间作限制的选项很有用,git log --since=2.weeks表示最近两周的所有提交。该命令可用的格式十分丰富——可以是类似"2008-01-15"的具体的某一天,也可以是类似"2 years 1 day 3 minutes ago"的相对日期。

附:5db2f65ee3c9da1a2c138fa04d8c2ae6.png

撤销操作

对上次提交撤回 @ git commit --amend

使用git commit --amend对本地仓库的上次提交重新修改。可以未改变内容,主要用于修改提交备注。
活着修改了文件活着向缓存区添加了新文件,用于修改仓库内容。
主要用于“啊,忘了添加一个文件”或 者 “小修补,修正笔误”这种提交信息弄乱你的仓库历史。注意

  • 使用git commit --amend会直接对上次提交内容直接覆盖!

  • 远程如果上次提交后同步了远程仓库,则修改后重新撤回提交,会导致报错,可以使用git push -f强制推送。

git commit --amend 相当于 git reset HEAD~ ; git commit 

从仓库取文件到缓存/工作区 @ git reset HEAD

从仓库取文件到缓存/工作区
已经修改了两个文件并且想要将它们作为两次独立的修改提交, 但是却意外地输入 git add *。暂存区文件添加多了,想要还原上次提交时候暂存区中某文件状态(未修改状态的文件)。显然git rm --cached 不合适,可以使用git reset HEAD 来在缓存区重置上次提交时候文件状态。
git reset HEAD 其实是从仓库中逆向抽取文件到缓存区,如果加上--hard则会从仓库中抽取文件覆盖到缓存区和工作区。(如果工作区有文件未保存会丢失)

参数
git reset HEAD 其实是调整指针用的,默认参数是--mixed表示重置HEAD和缓存区(索引);--hard则会重置 HEAD、缓存区和工作区;--soft表示只重置 HEAD,不影响缓存区和工作区

附加内容 ps

  • git reset 其实是重置了指针,原理是:reset 命令会以特定的顺序重写这三棵树,在你指定以下选项时停止:

  1. 移动 HEAD 分支的指向 (若指定了 --soft,则到此停止) 

  2. 使索引看起来像 HEAD (若未指定 --hard,则到此停止) 

  3. 使工作目录看起来像索引

git reset 的方式:git reset file.txt :其实是git reset --mixed HEAD file.txt的简写形式

我们可以不让 Git 从 HEAD 拉取数据,而是通过具体指定一个提交来拉取该文件的对应版本。我们只需运行类似 于git reset eb43bf file.txt的命令即可

从缓存区取文件到工作区 @ git checkout

  • 指定文件:从缓存区取文件到工作区
    可以使用git checkout -- 来从缓存区覆盖文件到工作区。还可以指定某个分支的文件git checkout --  ,跨分支会使文件同时提取到工作区和缓存区。

  • 不指定文件:切换branch。

一般性探究:git checkout 只能改变HEAD指针不能改变分支。(应该git中当前目录下是谁的文件就是处于谁的分支,git checkout 应该主要内容是读取分支内容,然后改变当前目录)因此可以使用git checkout 来取用其他分支中的文件到工作区。方法 git checkout --

参数:

# 用法
git checkout [<选项>] <分支> #切换分支
git checkout [<选项>] [<分支>] -- <文件>... #取文件到工作区和缓存区(跨分支提取)

# 选项/参数
-b <branch> #创建并检出一个新的分支
-B <branch> #创建/重置并检出一个分支
--overlay #使用叠加模式(默认)
-d, --detach #HEAD 从指定的提交分离
-f, --force #强制检出(丢弃本地修改)

撤销操作总结

4e39a206dd0a5c6d4b796eb8947cc1d5.png

远程仓库的使用

公钥配置

~/.ssh/id_rsa.pub文件中复制公钥内容(如果未有公钥,使用ssh-keygen -t rsa命令生成公钥),然后在git网站中配置自己的ssh,添加公钥内容,则此电脑便会被远端识别。

添加远程服务器

使用命令git remote add来添加远程某个仓库。

git remote add <rem_repo_name> <user@server:path/to/repo.gi>
# 远程仓库名字一般设置为origin,设置名字是为了多个远程仓库区分

# 例子:
git remote add origin git@gitee.com:veryqun/have_atest.git

远程仓库管理

查看信息
可以在本地仓库文件夹下,使用以下命令查看远程仓库信息

git remote                  #查看已添加的远程仓库
git remote -v #显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL
git remote show <remote> #查看某仓库详细信息

删除、修改信息
可以使用git remote remove删除远程配置,但一旦你使用这种方式删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。

git remote rename <old_name> <new_name>     #修改远程仓库地址的简写
git remote remove <remote> #删除远程仓库的地址

注意:
在添加了远程仓库后,就可以使用远程仓库名称代替仓库网址了。

从远程取回

可以使用git fetch或者git pull来从远程抓取或拉取。

git fetchgit fetch 会访问远程仓库,从中拉取所有你还没有的数据。
git fetch 完成了仅有的但是很重要的两步:

  1. 从远程仓库下载本地仓库中缺失的提交记录

  2. 更新远程分支指针(如 o/master)

git fetch 实际上将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态。例如远程仓库在另一个终端提交了新文件,但是本地并没有远程仓库的改变,此时应该使用git fetch 来更新最新状态。然后如果想要把远程更新同步到本地可以使用git merge remote/branch branch

git pull
其实git fetch + git merge 相当于git pull 此操作会将远程的branch分枝同步到本地,然后和当前分支合并

打标签 @ tag

添加标签

标签分两种

  • 轻量标签
    轻量标签使用git tag 就可以直接对上次提交进行打标签

  • 注释标签
    在添加标签时候为标签添加注释,git tag -a -m ""

git tag <version>                       #对上次提交添加标签
git tag -a <version> -m "" #对上次提交添加注释标签

列出标签

# 用法
git tag #列出所有存在的标签
git tag -l "v1.8*" #使用通配符列出标签
git show <tag> #显示提交内容和标签注释

# 例子
git show v1.4-lw

补充标签

如果是已经提交过之前的历史提交进行打标签需要git tag
例如git tag -a v1.2 9fceb02

共享标签

默认情况下,git push 命令并不会传送标签到远程仓库服务器上。可以在推送的时候通过 git push origin 来进行推送标签。
如果想要一次性推送很多标签,也可以使用带有 --tags 选项的 git push 命令。这将会把所有不在远程仓库 服务器上的标签全部传送到那里。

# 用法
git push <remote> <tag> #向远程推送标签,必须是本读存在的标签
git push <remote> --tags #远程仓库不存在的tag会一并从本地推送到远程仓库

# 例子
git push gitee t1.0
git push gitee --tags

删除标签

  • 删除本地标签
    使用git tag -d 来删除本地标签

  • 删除远程标签
    使用git push :refs/tags/来更新远程仓库的tag。这句话的意思是将冒号前面的空值推送到远程标签名,从而高效地删除它

# 用法
git tag -d <tag> #删除本地标签,但是远程标签不会随着新提交而消失
git push <remote> :refs/tags/<tag> #同步远程标签
git push <remote> --delete <tagname> #删除远程标签


# 例子
git tag -d t1.0
git push gitee :refs/tags/t1.0
git push gitee --delete t1.0

标签的检出

可以使用git checkout 来分离头指针,在分离HEAD指针状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任 何分支,并且将无法访问,除非通过确切的提交哈希才能访问。
直接在本地通过checkout哈希值或者远端分支也有类似的效果
可以通过git checkout -b version2 v2.0.0命令来在tag v2.0.0所指的提交上新建一个名为version2的分支并检出该分支。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值