Git使用指南

1,390 阅读14分钟

简介

Git 是目前最流行的源代码管理工具,作为开发也是必须掌握的一个东西。本文结合笔者实践分享Git的一些常用操作和常见问题。

常用命令

git仓库管理

git管理有两种方法,第一种是新建文件夹然后初始化成git仓库,第二种是直接克隆现有git仓库。

初始化本地文件夹

如果文件夹是本地新建的,就需要进行 git 初始化,初始化会在当前文件夹下创建.git 隐藏文件夹。这样文件夹下的文件就会被 git 追踪了。

在当前目录新建一个 git 代码库

git init

在当前目录新建一个文件夹并初始化为一个 git 代码库

git init [project-name]

克隆现有仓库

如果是克隆已有仓库就不需要进行 git 的初始化了,因为已经被git管理了。

git clone xxxx [文件夹名]

配置远端仓库

配置远端仓库能方便我们代码的提交和拉取,否则只能自己一个人在本地玩,不方便协作。

配置远端仓库主流的有httpsssh两种方法。

https

使用https方式很简单,我们克隆或提交的时候只需要输入密码即可。

ssh

使用ssh相对来说复杂点,下面是配置ssh的详细步骤。

# 生成秘钥
# 密钥类型可以用 -t 选项指定。如果没有指定则默认生成用于 SSH-2 的 RSA 密钥。这里使用的是 rsa。
# 在密钥中有一个注释字段,用-C 来指定所指定的注释,可以方便用户标识这个密钥,所以在这里输入自己的邮箱或者其他都行。

ssh-keygen -t rsa -C '1287530097@qq.com'

# 输入完毕后程序同时要求输入一个密语字符串(passphrase),空表示没有密语。接着会让输入 2 次口令(password),空表示没有口令。
# 3 次回车即可完成当前步骤,此时[c盘>用户>自己的用户名>.ssh]目录下已经生成好了。

# 配置github。
# 登录 github,打开 setting->SSH keys,点击右上角 New SSH key,把生成好的公钥 id_rsa.pub文件内容放进 key 输入框中,再为当前的 key 起一个 title 来区分每个 key。

文档查询

查看命令大纲

git help

查看所有命令

git help -a

远端仓库配置

有了远端仓库,我们的代码就能共享了。

查看远端仓库

git remote -v

添加远端仓库

这里的 origin 只是一个名字,可以随便命名,只是我们习惯取名为origin

git remote add origin <address>

重新命名远端仓库

git remote rename oldName newName

移除远端仓库

这里的origin就是我们上面命的名字,需要根据自己的实际情况来。

git remote remove origin

配置

配置分为三种类型的配置

列出本地配置

本地配置在当前项目的.git隐藏文件夹内,是一个名为gitconfig的文件。

git config --local --list

列出全局配置

全局配置在当前用户的目录下,是一个名为gitconfig的文件。比如笔者的就在C:\Users\randy目录下

git config --global --list

列出系统配置

系统配置在git的安装目录下,是一个名为gitconfig的文件。比如笔者的就在C:\Program Files\Git\etc目录下

git config --system --list

列出所有配置

这个命令会依次按顺序列出系统、全局、项目所有的配置。如果有相同配置会使用如下顺序依次覆盖 项目配置 > 全局配置 > 系统配置

git config --list

配置用户名

全局配置

git config --global user.name "your name"

本仓库配置

git config --local user.name "your name"

配置用户邮箱

全局配置

git config --global user.email "your email"

本仓库配置

git config --local user.email "your email"

配置别名

全局配置

git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status

分支

查看本地分支

git branch

查看远程分支

git branch -r

查看本地和远程分支

git branch -a

切换分支

git checkout <branch-name>

切换分支,并创建分支。如果分支不存在则创建该分支并切换到该分支,如果分支存在则切换失败

git checkout -b <branch-name>

删除分支

git branch -d <branch-name>

如果分支有改动并且没 push 到远程,-d 删除分支就会失败,如果需要强制删除需要使用 -D 进行强制删除。

git branch -D <branch-name>

删除远程分支

git push origin -d <branch-name>

重命名分支

git branch -m <oldbranch-name> <newbranch-name>

status

查看状态,我们知道git有工作区,暂存区、本地仓库三个区间。我们通过status就可以清楚的知道文件目前在哪个区间。

add

add用来将文件从工作区添加到暂存区

添加指定文件到暂存区

git add <file-name>

添加全部文件到暂存区

git add .

commit

commit用来将文件提交到本地仓库

从暂存区提交

git commit -m 'xxx'

从工作区提交

提交到暂存区并且提交到本地仓库一步到位,注意未跟踪的文件不会被提交。

git commit -am 'xxx'

修改commit message

有时我们提交的时候可能提交太快没检查commit message,导致message有问题需要需改。我们可以使用--amend

该命令修改提交的 message不是直接修改原 commitmessage,而是生成一条新的 commit,把当前 commit 替换掉。

git commit --amend -m '新消息'

遗漏文件提交

有时我们提交之后发现有文件漏提交了怎么办?我们可以重新再提交一次,但是会多生成一个commit记录。

使用--amend --no-edit不会多生成commit记录,会把该文件加到上次的commit里面,提交记录还是一个。

git add missed-file // missed-file 为遗漏提交文件
git commit --amend --no-edit

--no-edit 表示提交消息不会更改,在 git 上仅为一次提交

push

push用来将本地仓库的提交推送到远端指定分支

git push origin <branch-name>

fetch

fetch用来将远端分支代码拉取下来

git fetch origin <branch-name>

pull

pull用来将远端分支代码拉取下来并与当前分支进行 merge

git pull origin <branch-name>

rm

rm用来删除文件或缓存

删除文件

删除文件,并且将这次删除放入暂存区,前提是该文件是本地仓库的文件,不能是新建的文件。

git rm <file-name>

清除指定文件缓存

停止追踪指定文件,但该文件会保留在工作区(当你忘记添加 .gitignore 文件 这个方法很有效)

git rm --cached <file-name>

清除所有文件缓存

清除 git 所有的缓存,也就是把所有文件置为未追踪状态。

git rm -r --cached .

stash

stash是暂存的意思,就是我们有时候某些改动不想提交的时候就可以先暂存起来。

查看暂存列表

git stash list

暂存

用来将所有已跟踪的文件保存至堆栈中。(意思就是还在工作区的新文件是不会被暂存的)

git stash

用来将所有文件保存至堆栈中,包括未追踪的。(意思就是还在工作区的新文件也会被暂存)

git stash -u

暂存并添加备注

git stash save 'xxx'

查看暂存改动

查看当前暂存中修改了哪些文件

git stash show stash@{n}

查看当前暂存中修改了哪些文件的内容

git stash show -p stash@{n}

提取暂存

提取最近的一次暂存并在暂存列表清除这次暂存。

git stash pop

提取指定的暂存并在暂存列表清除这次暂存。这里的 n 是具体的数字,可以使用 git stash list 查看暂存列表。

git stash pop stash@{n}

提取最近的一次暂存。(并不会在暂存列表清除该暂存记录)

git stash apply

提取指定的暂存。这里的 n 是具体的数字,可以使用 git stash list 查看暂存列表。

git stash apply stash@{n}

删除暂存

删除某暂存

git stash drop stash@{n}

清除暂存列表

git stash clear

diff

diff主要用来比较文件的差异。

比较工作区和暂存区的不同

git diff

比较工作区和本地仓库的不同

git diff HEAD

比较暂存区和本地仓库的不同

git diff --staged(Git 1.6.1 及更高版本允许使用) / --cached

比较两个不同的提交

git diff commitId1..commitId2

比较两个不同分支

比较两个不同的分支,需要是已经提交的不同。

git diff branch1..branch2

比较两个不同的远端分支

git diff origin/branch1..origin/branch2

比较本地分支和远端分支

git diff branch1..origin/branch2

比较两个不同的分支某文件

git diff branch1..branch2 <file-name>

log

log主要用来查看我们git commit的记录。

查看提交 log

简要显示 commitId、Author、Date、message

git log

查看提交 log 文件级别的显示

除了显示 commitId、Author、Date、message 外还显示修改了哪些文件

git log --stat

查看提交 log 文件详情级别的显示

除了显示 commitId、Author、Date、message 外还显示修改了哪些文件,并且显示文件具体改动细节。

git log -p

由于内容较大,你也可以加上 -2 (git log -p -2)来仅显示最近两次提交

git log -p -2

查看某次提交的具体改动

git show commitId

查看某次提交的某个文件的具体改动

git show commitId <file-name>

查看最近的一次提交的具体改动可以省略 commitId

git show

查看详细操作 log

reflog是详细的log,是我们对git操作的log,包括分支切换、代码合并等等操作。

git reflog

我们可以使用 git checkout reflogid 切换到某个操作上。(git checkout 并不仅仅只能切换到某分支或者某 tag 上)

reflog用处很多,这里笔者就不详细讲述了。

查看分支提交图

git log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative

回退

回退用在我们暂存、提交有误的时候。

撤销工作区的改动

撤销工作区某文件

git checkout <file-name>

撤销工作区所有文件

git checkout .

撤销暂存区

撤销暂存区某文件

git checkout HEAD <file-name>

撤销暂存区所有文件

git checkout HEAD .

撤销暂存区某文件到工作区

git reset HEAD <file-name>

撤销暂存区所有文件到工作区

git reset HEAD .

撤销本地仓库

回退之后前面的 commit 就会消失。

1、--mixed 改动回退到工作区(默认) 2、--soft 改动回退到暂存区 3、--hard 删除提交改动并放弃掉,

git reset [--hard | --soft | --mixed] commitId

回退到上上次提交,可以使用 HEAD^代替 commitId,上上上次提交 可以使用 HEAD^^

git reset HEAD^

revert

revert 用来生成一个与指定 commitId 相反的提交。

git revert commitId

提交一个新的 commit 它的内容和最近的一个 commit 完全相反。

git revert HEAD

cherry-pick

将指定的提交 commit 应用于当前分支。(可以用于在错误的分支提交代码)

git cherry-pick commitId

tag

tag 只是在某 commit 上打上标签,并不会产生提交。在我们上线的时候会常用到。

列出已有 tag

git tag

新建 tag

git tag v1.0.0

新建带有备注信息的 tag

git tag -a v1.0.0 -m '初始版本'

给指定的某个 commit 加 tag

git tag -a v1.0.0 -m '某版本' commitId

删除 tag

git tag -d v1.0.0

查看 tag 详情

可以利用 tag 的 commitId 进行代码的回滚

git show v1.0.0

把 tag 推送到远端

git push origin v1.0.0

把所有不存在的 tag 推送到远程

git push origin --tags

切换到某个 tag 下

切换到某个 tag 跟分支一样,可以直接切换到某个 tag 去。这个时候不位于任何分支,处于游离状态,可以考虑基于这个 tag 创建一个分支。

git checkout v1.0.0

merge

把目标 commit 的路径上的所有 commit 的内容一并应用到当前 commit,然后自动生成一个新的 commit

git merge <branch-name>

取消 merge

git merge --abort

rebase

有些人不喜欢 merge,因为在 merge 之后,commit 历史就会出现分叉,这种分叉再汇合的结构会让有些人觉得混乱而难以管理。 如果你不希望 commit 历史出现分叉,可以用 rebase 来代替 merge

// 将当前分支的提交移动到目标分支后面
git rebase <branch-name>

比如

image.png

执行 rebase main

image.png

继续rebase

git rebase --continue

取消 rebase

git rebase --abort

交互式 rebase

rebase -irebase --interactive 的缩写形式,意为「交互式 rebase」。

git rebase -i commitId

交互式 rebase常用场景如下:

  1. 修改不是第一条提交的 message。rebase -i commitId,把需要修改的 commit 的 message 使用 edit/e 标识。

  2. 合并提交。rebase -i HEAD^^。把需要合并的 commit 的 message 用 squash/s 标识。

  3. 删除某次提交。rebase -i HEAD^^。把需要删除的 commit 的 message 去掉即可。

^和~符号的作用

^

^ 的用法:在 commit 的后面加一个或多个 ^ 号,可以把 commit 往回偏移,偏移的数量是 ^ 的数量。例如:master^ 表示 master 指向的 commit 之前的那个 commit; HEAD^^ 表示 HEAD 所指向的 commit 往前数两个 commit。

~

~ 的用法:在 commit 的后面加上 ~ 号和一个数,可以把 commit 往回偏移,偏移的数量是 ~ 号后面的数。例如:HEAD~5 表示 HEAD 指向的 commit 往前数 5 个 commit。

忽略文件 .gitignore

该文件用来指示哪些文件可以被git忽略,也就是不会被git管理起来。

# 此行为注释 会被Git忽略

# 忽略 node_modules/ 目录下所有的文件
node_modules


# 忽略所有.vscode结尾的文件
.vscode

# 忽略所有.md结尾的文件
*.md

# 但README.md 除外
!README.md

# 会忽略 doc/a.txt 但不会忽略doc/files/b.txt
doc/*.txt

# 忽略 doc/ 目录下所有扩展名为txt文件

doc/**/*.txt

git使用常见问题

git pull 和 git fetch 的区别

git fetch 只是将远程仓库的变化下载下来,并没有和本地分支合并。

git pull 会将远程仓库的变化下载下来,并和当前分支合并。

git rebase 和 git merge 的区别

git rebasegit merge 都是用于分支合并,关键在 commit 记录的处理上不同。

git merge 会新建一个新的 commit 对象,然后两个分支以前的 commit 记录都指向这个新 commit 记录。这种方法会保留之前每个分支的 commit 历史。

git rebase 会先找到两个分支的第一个共同的 commit 祖先记录,然后将提取当前分支这之后的所有 commit 记录,然后将这个 commit 记录添加到目标分支的最新提交后面。经过这个合并后,两个分支合并后的 commit 记录就变为了线性的记录了。

假设做开始代码是这样的

     A---B---C  remotes/origin/master
    /
D---E---F---G  master

执行 merge之后

     A---B---C remotes/origin/master
    /         \
D---E---F---G---H master

执行rebase之后

           remotes/origin/master
               |
D---E---A---B---C---F'---G'  master

git 大小写问题

默认情况下 git 是忽略区分大小写的,多人合作的情况下不规范很容易造成问题,所以开启区分大小写。可以使用 git config --list 查看 git 配置

本地开启不忽略大小写

git config core.ignorecase false

全局开启不忽略大小写

git config --global core.ignorecase false

git 中修改.gitignore 文件不起作用的解决

如果以前在 git 的管理中现在不想管理了想忽略我们可以修改.gitignore 文件,把规则添加进去,但是我们发现简单添加规则是不起作用的。因为这个文件已经被管理了所以简单的配置已经不行了。

我们需要使用 git rm -r --cached . 来删除 git 的缓存。.表示所有文件。我们也可以使用具体的路径来删除指定文件。

删除缓存后我们可以再使用 add .添加再提交就可以了。

参考文献

progit

git book

掘金小册-Git 原理详解及实用指南

后记

感谢小伙伴们的耐心观看,本文为笔者个人学习笔记,如有谬误,还请告知,万分感谢!如果本文对你有所帮助,还请点个关注点个赞~,您的支持是笔者不断更新的动力!