Git学习笔记

20 篇文章 0 订阅
2 篇文章 0 订阅


写在前面,本文将介绍几个常用的Git命令( git命令文档)。如有不对之处,欢迎大家指正。

一、git checkout

切换分支或恢复工作树文件

git checkout [-q] [-f] [-m] [<branch>]
git checkout [-q] [-f] [-m] --detach [<branch>]
git checkout [-q] [-f] [-m] [--detach] <commit>
git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>]
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>…​
git checkout [<tree-ish>] [--] <pathspec>…​
git checkout (-p|--patch) [<tree-ish>] [--] [<paths>…​]

1.1 操作文件
** git checkout – <文件名 >**
此命令意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是file自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是file 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。

1.2 操作分支

git checkout <分支名>
将分支切换到指定分支
git checkout -b <分支名>
如果分支存在则只切换分支,若不存在则创建并切换到新建分支

二、HEAD

HEAD 是一个对当前检出记录的符号引用,HEAD 总是指向当前分支上最近一次提交记录。
分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。在命令执行之前的状态如下所示:
在这里插入图片描述
此时的HEAD指向的是master,我们执行一下git checkout c1,得到下面的结果
在这里插入图片描述
发现HEAD指向了C1,这就是我们说的分离的HEAD

三、相对引用(^) 和(~num)

  • 使用 ^ 向上移动 1 个提交记录
  • 使用 ~ 向上移动多个提交记录,如 ~3

我们来看一下示例
在这里插入图片描述

此时的HEAD在master这个分支上,执行git checkout master^或者git checkout HEAD^
在这里插入图片描述
HEAD指向了C1这个节点了。如果使用git checkout master~2者git checkout HEAD~2,HEAD就指向C0了。

四、git add

将文件内容添加到索引(将修改添加到暂存区)。也就是将要提交的文件的信息添加到索引库中。

git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]
	  [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]]
	  [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--renormalize]
	  [--chmod=(+|-)x] [--] [<pathspec>…​]

4.1 git add
filename可以是文件也可以是目录

4.2 git add .
提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件。

4.3 git add -u
提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)。(git add --update的缩写)

4.4 git add -A
新增的、修改的、删除的文件均会被提交至暂存区(git add --all的缩写)

注意:在git 2.x.x版本后 git add .和git add -A作用一样了

五、git commit

记录对存储库的更改,将索引的当前内容存储在一个新的提交中,以及来自描述更改的用户的日志消息。

git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]
	   [--dry-run] [(-c | -C | --fixup | --squash) <commit>]
	   [-F <file> | -m <msg>] [--reset-author] [--allow-empty]
	   [--allow-empty-message] [--no-verify] [-e] [--author=<author>]
	   [--date=<date>] [--cleanup=<mode>] [--[no-]status]
	   [-i | -o] [-S[<keyid>]] [--] [<file>…​]

git commit 主要是将暂存区里的改动给提交到本地的版本库。每次使用git commit 命令我们都会在本地版本库生成一个40位的哈希值,这个哈希值也叫commit-id,
commit-id在版本回退的时候是非常有用的,它相当于一个快照,可以在未来的任何时候通过与git reset的组合命令回到这里.

5.1 git commit -m "message"
提交已经被add进来的改动.
这种是比较常见的用法,-m 参数表示可以直接输入后面的“message”,注意是双引号,如果不加 -m参数,那么是不能直接输入message的,而是会调用一个编辑器一般是vim来让你输入这个message,
message即是用来说明这次提交的描述。
commit message格式::
注意冒号后面有空格。

type:用于说明commit的类别,只允许使用下面7个标识

  • feat:新功能(feature)
  • fix:修复bug
  • docs:文档(documentation)
  • style:格式(不影响代码运行的变动)
  • refactor:重构(既不是新增功能也不是修改bug的代码变动)
  • test:增加测试
  • chore:构建过程或辅助工具的变动

subject:commit目的的简短描述

5.2 git commit --amend
git commit --amend //也叫追加提交,它可以在不增加一个新的commit-id的情况下将新修改的代码追加到前一次的commit-id中;

回退命令:
$ git reset --hard HEAD^ 回退到上个版本
$ git reset --hard HEAD~3 回退到前3次提交之前,以此类推,回退到n次提交之前
$ git reset --hard commit_id 退到/进到 指定commit的sha码

强推到远程:

$ git push origin HEAD --force

六、git reset

git reset [-q] [<tree-ish>] [--] <paths>…​
git reset (--patch | -p) [<tree-ish>] [--] [<paths>…​]
git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
1.git reset HEAD
把暂存区的修改撤销掉,重新放回工作区:

版本退回主要有以下三种情况
2.git reset --soft
commit-id为错误commit之前的,commit-ID
错误commit后,仅撤销commit;暂存区、工作区内容不变。

3.git reset --mixed
错误commit后。仅撤销commit和add;工作区内容不变

4.git reset --hard
错误commit之后,想要恢复到某个版本库的代码(暂存区,工作区均变化)

解释一下此处提到的工作区、暂存区、版本库
工作区(Working Directory):简单来说就是你本地的代码目录文件
暂存区:git add 到的地方
版本库(Repository):git commit 到的地方,也就是我们远端代码仓库
在这里插入图片描述

七、git rm

从版本库中删除文件,那就用命令git rm 删掉,并且git commit

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​

八、git branch

git branch [--color[=<when>] | --no-color] [-r | -a]
	[--list] [-v [--abbrev=<length> | --no-abbrev]]
	[--column[=<options>] | --no-column] [--sort=<key>]
	[(--merged | --no-merged) [<commit>]]
	[--contains [<commit]] [--no-contains [<commit>]]
	[--points-at <object>] [--format=<format>] [<pattern>…​]
	
git branch [--track | --no-track] [-f] <branchname> [<start-point>]
git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
git branch --unset-upstream [<branchname>]
git branch (-m | -M) [<oldbranch>] <newbranch>
git branch (-c | -C) [<oldbranch>] <newbranch>
git branch (-d | -D) [-r] <branchname>…​
git branch --edit-description [<branchname>]

一般用于分支的操作,比如创建分支,查看分支等等
8.1 git branch
不带参数:列出本地已存在的分支,并且在当前分支的前面用“*”标记
8.2 git branch -r
查看远程版本库分支列表
8.3 git branch -a
查看所有分支列表,包括本地和远程
8.4 git branch <分支名>
创建新分支但仍停留在当前分支上
8.5 git branch -d <分支名>
删除dev分支,如果在分支中有一些未merge的提交,那么会删除分支失败,此时可以使用 git branch -D dev:强制删除dev分支
8.6 git branch -vv
可以查看本地分支对应的远程分支
8.7 git branch -m oldName newName
给分支重命名

九、git merge

git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit]
	[-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
	[--[no-]allow-unrelated-histories]
	[--[no-]rerere-autoupdate] [-m <msg>] [-F <file>] [<commit>…​]
git merge --abort
git merge --continue

在git-merge命令中,有以下参数:

git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit] [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]] [--[no-]rerere-autoupdate] [-m <msg>] [<commit>...]

1.git merge <分支名>
将指定分支合并到当前分支中。
2.git merge --abort
该命令仅仅在合并后导致冲突时才使用。git merge --abort将会抛弃合并过程并且尝试重建合并前的状态。但是,当合并开始时如果存在未commit的文件,git merge --abort在某些情况下将无法重现合并前的状态。(特别是这些未commit的文件在合并的过程中将会被修改时)
3.git merge --ff <分支名> 和git merge --no-ff <分支名>
–ff是指fast-forward命令。当使用fast-forward模式进行合并时,将不会创造一个新的commit节点。默认情况下,git-merge采用fast-forward模式。
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并。
4.git merge --commit <分支名> 和git merge --no-commit <分支名>
–commit参数使得合并后产生一个合并结果的commit节点。该参数可以覆盖–no-commit。
–no-commit参数使得合并后,为了防止合并失败并不自动提交,能够给使用者一个机会在提交前审视和修改合并结果。
以上是比较常用的参数,其他参数的用法可以参照这位Chuckiefan作者的git-merge完全解析

十、git rebase

Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。Rebase 的优势就是可以创造更线性的提交历史,代码库的提交历史将会变得异常清晰。

git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>]
	[<upstream> [<branch>]]
git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>]
	--root [<branch>]
git rebase --continue | --skip | --abort | --quit | --edit-todo | --show-current-patch

我们来看一个示例
在这里插入图片描述
准备了两个分支;注意当前所在的分支是 bugFix(星号标识的是当前分支),把 bugFix 分支里的工作直接移到 master 分支上。移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。使用git rebase master得到下面的结果
在这里插入图片描述
现在我们切换到master分支上,执行git rebase bugFix看看
在这里插入图片描述
好了!由于 bugFix 继承自 master,所以 Git 只是简单的把 master 分支的引用向前移动了一下而已。

交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i
如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。

十一、git tag

git tag [-a | -s | -u <keyid>] [-f] [-m <msg> | -F <file>] [-e] <tagname> [<commit> | <object>]
git tag -d <tagname>…​
git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]
	[--points-at <object>] [--column[=<options>] | --no-column]
	[--create-reflog] [--sort=<key>] [--format=<format>]
	[--[no-]merged [<commit>]] [<pattern>…​]
git tag -v [--format=<format>] <tagname>…​

打标签其实就是给特定的commit做个标记,类似于里程碑的东西。在版本管理中,我们可以为每个版本打个标签,或者在每次发版时打个标签,便于后期的查找。
1.git tag
展示所有标签,注意:标签不是按时间顺序列出,而是按字母排序的。

2.git tag
创建一个新标签,默认标签是打在最新提交的commit上的。

3.git tag
给指定commit打标签

4.git tag -a -m
给指定commit创建带有说明的标签,用-a指定标签名,-m指定说明文字

5.git tag -d
删除指定标签,因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。

6.git push origin
推送某个标签到远程

7.git push origin --tags
一次性推送全部尚未推送到远程的本地标签

8.git push origin :refs/tags/
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除git tag -d ,再执行此命令删除远程tag

注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

十二、git revert

前面我们提到了reset来实现版本回退,现在来看看另一种版本回退的方式git revert。
git revert的语法如下:

#指定某次commit
git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>…​
#可用于在选择或还原失败后解决冲突后继续
git revert --continue 
#忘记当前正在进行的操作,可用于在选择或还原失败后清除排序器状态
git revert --quit
#取消操作并返回到预序列状态
git revert --abort

git revert的作用通过创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,但是HEAD指针是指向这个新生成的版本,而不是目标版本。git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。

十三、git cherry-pick

git cherry-pick用于把另一个本地分支的一个或多个commit修改应用到当前分支。

git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff]
		  [-S[<keyid>]] <commit>…​
git cherry-pick --continue
git cherry-pick --quit
git cherry-pick --abort

1、git cherry-pick
单独合并一个提交

2、git cherry-pick -x
同上,不同点:保留原提交者信息。

3、 git cherry-pick … 和 git cherry-pick ^…
前者表示把到之间(左开右闭,不包含start-commit-id)的提交cherry-pick到当前分支;
后者表示把到之间(闭区间,包含start-commit-id)的提交cherry-pick到当前分支。
其中,到只需要commit-id的前6位即可,并且在时间上必须早于

注:以上合并,需要手动push代码。

十四、git fetch

git fetch [<options>] [<repository> [<refspec>…​]]
git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…​]
git fetch --all [<options>]

git fetch 将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态
来看下面这个例子:我们有一个远程仓库, 它有两个我们本地仓库中没有的提交。
在这里插入图片描述

执行git fetch后C2,C3 被下载到了本地仓库,同时远程分支 o/master 也被更新
在这里插入图片描述

git fetch 完成了仅有的但是很重要的两步:

  • 从远程仓库下载本地仓库中缺失的提交记录
  • 更新远程分支指针(如 o/master)
    远程分支反映了远程仓库在你最后一次与它通信时的状态,git fetch 就是你与远程仓库通信的方式了

git fetch 并不会改变你本地仓库的状态。它不会更新你的 master 分支,也不会修改你磁盘上的文件。

fetch更新本地仓库两种方式:

//方法一
$ git fetch origin master //从远程的origin仓库的master分支下载代码到本地的origin master

$ git merge origin/master  //把远程下载下来的代码合并到本地仓库,远程的和本地的合并

//方法二
$ git fetch origin master:temp //从远程的origin仓库的master分支下载到本地并新建一个分支temp

$ git diff temp //比较master分支和temp分支的不同

$ git merge temp//合并temp分支到master分支

$ git branch -d temp//删除temp

十五、git pull

git pull [<options>] [<repository> [<refspec>…​]]

将远程仓库代码更新至本地仓库,也就是先抓取更新再合并到本地分支
来看下面这个示例:
在这里插入图片描述

我们用git fetch; git merge o/master这两个命令看看

在这里插入图片描述

用 fetch 下载了 C3, 然后通过 git merge o/master 合并了这一提交记录。现在我们的 master 分支包含了远程仓库中的更新(在本例中远程仓库名为 origin)

我们再用git pull试试,得到了同样的结果
在这里插入图片描述
git pull 就是 git fetch 和 git merge 的缩写!

十六、git push

git push 负责将你的变更上传到指定的远程仓库,并在远程仓库上合并你的新提交记录。

git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
	   [--repo=<repository>] [-f | --force] [-d | --delete] [--prune] [-v | --verbose]
	   [-u | --set-upstream] [-o <string> | --push-option=<string>]
	   [--[no-]signed|--signed=(true|false|if-asked)]
	   [--force-with-lease[=<refname>[:<expect>]]]
	   [--no-verify] [<repository> [<refspec>…​]]

示例如下:
在这里插入图片描述
使用git push命令得到下面的结果
在这里插入图片描述
远程仓库接收了 C2,远程仓库中的 master 分支也被更新到指向 C2 了,我们的远程分支 (o/master) 也同样被更新了。

1、git push origin master
将本地的master分支推送到origin主机的master分支。如果master不存在,则会被新建。
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
2、git push origin :master
等同于git push origin --delete master,表示删除origin主机的master分支。如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
3、git push origin
表示将当前分支推送到origin主机的对应分支。如果当前分支只有一个追踪分支,那么主机名都可以省略。
4、git push --all origin
表示将所有本地分支都推送到origin主机。

以后遇到git方面的其他内容再进行补充。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值