简介
Git 是目前最流行的源代码管理工具,作为开发也是必须掌握的一个东西。本文结合笔者实践分享Git的一些常用操作和常见问题。
常用命令
git仓库管理
被git管理有两种方法,第一种是新建文件夹然后初始化成git仓库,第二种是直接克隆现有git仓库。
初始化本地文件夹
如果文件夹是本地新建的,就需要进行 git 初始化,初始化会在当前文件夹下创建.git 隐藏文件夹。这样文件夹下的文件就会被 git 追踪了。
在当前目录新建一个 git 代码库
git init
在当前目录新建一个文件夹并初始化为一个 git 代码库
git init [project-name]
克隆现有仓库
如果是克隆已有仓库就不需要进行 git 的初始化了,因为已经被git管理了。
git clone xxxx [文件夹名]
配置远端仓库
配置远端仓库能方便我们代码的提交和拉取,否则只能自己一个人在本地玩,不方便协作。
配置远端仓库主流的有https和ssh两种方法。
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不是直接修改原 commit 的 message,而是生成一条新的 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>
比如
执行 rebase main 后
继续rebase
git rebase --continue
取消 rebase
git rebase --abort
交互式 rebase
rebase -i 是 rebase --interactive 的缩写形式,意为「交互式 rebase」。
git rebase -i commitId
交互式 rebase常用场景如下:
-
修改不是第一条提交的 message。rebase -i commitId,把需要修改的 commit 的 message 使用 edit/e 标识。
-
合并提交。rebase -i HEAD^^。把需要合并的 commit 的 message 用 squash/s 标识。
-
删除某次提交。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 rebase 和 git 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 .添加再提交就可以了。
参考文献
后记
感谢小伙伴们的耐心观看,本文为笔者个人学习笔记,如有谬误,还请告知,万分感谢!如果本文对你有所帮助,还请点个关注点个赞~,您的支持是笔者不断更新的动力!