工作中常用的Git操作命令(一)
说明
时间过得真快,一转眼吗喽也是好歹工作几年了,把这些年平时用的git命令整理记录一下,分几个文章,囊括了常用的命令,工作日常很多时候都是使用svn,回到宿舍自己的项目才是git,就问你离不离谱。。
好习惯
首先在提交代码的时候,任何提交注释都得标准化,格式统一,这样别人才看的赏心悦目,下面格式提交说明:
1、feat: 新功能(feature)用于提交新功能。例如:feat: 增加用户注册功能
2、fix: 修复 bug用于提交 bug 修复。例如:fix: 修复登录页面崩溃的问题
3、refactor: 代码重构(既不是新增功能也不是修复bug的代码更改)用于提交代码重构。
例如:refactor: 重构用户验证逻辑
4、perf: 性能优化用于提交提升性能的代码修改。例如:perf: 优化图片加载速度
5、chore: 杂项(构建过程或辅助工具的变动)用于提交构建过程、辅助工具等相关的内
容修改。例如:chore: 更新依赖库
6、build: 构建系统或外部依赖项的变更用于提交影响构建系统的更改。例如:build: 升级
webpack到版本5
7、ci: 持续集成配置的变更用于提交CI配置文件和脚本的修改。例如:ci: 修改GitHub
Actions配置文件
8、revert: 回滚用于提交回滚之前的提交.
另外还有其他三个相对来说不太常用的:
1、docs: 文档变更用于提交仅文档相关的修改。例如:docs: 更新README文件
2、style: 代码风格变动(不影响代码逻辑)用于提交仅格式化、标点符号、空白等不影响代码运行的变更。例如:style: 删除多余的空行
3、test: 添加或修改测试用于提交测试相关的内容。例如:test: 增加用户模块的单元测试
命令
目录
说明
好习惯
命令
项目初次运行的配置
记录每次更新到仓库
初始化一个仓库
从第三方平台克隆仓库
跟踪新文件
查看文件状态
文件具体修改
创建提交
移除文件
指向正确的远程仓库地址
远程分支管理
当前所在分支与远程分支对应
更新同步最新提交
合并提交
移除文件
查看提交历史
撤销操作
取消暂存的文件
恢复到上次提交的内容
单独撤销某个文件变动至上次
从远程仓库中获得数据
项目初次运行的配置
项目初次运行的时候,得检查config配置,看看配置变量啥的,设置一下user.name和user.email
,1和2都差不多,一个是长选项,一个是短选项,都得掌握
git config --list --show-origin
git config -l
git config --global
git config user.name
git config --global user.name "xxxxxx"
记录每次更新到仓库
暂存区和非暂存区,已跟踪和未跟踪文件状态时序图
初始化一个仓库
配置并初始化一个仓库(repository)、开始或停止跟踪(track)文件、暂存(stage)或提交(commit)更改,创建一个名为 .git
的子目录,这个子目录含有初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干
git init
从第三方平台克隆仓库
基础就是git clone 加上克隆git地址
git clone https://github.com/libgit2/libgit2 mylibgit
如果要克隆指定分支的话, 带上 -b
git clone -b uniapp_branch https://gitee.com/charlinheng/github_share.git
跟踪新文件
要将你改或者新添加的文件保存在暂存区,那你得标记这个文件,跟踪这个文件
# 添加一个
git add README.md
要添加多个,则
git add README.md README2.md
添加所有
git add .
要查看是否已经被跟踪,处于暂存状态,你可以用git status
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: README
只要在 Changes to be committed
这行下面的,就说明是已暂存状态。 如果此时提交,那么该文件在你运行 git add
时的版本将被留存在后续的历史记录中。 你可能会想起之前使用 git init
后就运行了 git add <files>
命令,开始跟踪当前目录下的文件。 git add
命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。
注意,如果你不想使用git add . 可以直接使用git commit -a
查看文件状态
可以用 git status
命令查看哪些文件处于什么状态。 如果在克隆仓库后立即使用此命令,会看到类似这样的输出:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
git status
命令的输出十分详细,但其用语有些繁琐。 Git 有一个选项可以帮你缩短状态命令的输出,这样可以以简洁的方式查看更改。 如果你使用 git status -s
命令或 git status --short
命令,你将得到一种格式更为紧凑的输出。
$ git status -sM README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
新添加的未跟踪文件前面有
??
标记,新添加到暂存区中的文件前面有
A
标记,修改过的文件前面有
M
标记。
文件具体修改
如果 git status
命令的输出对于你来说过于简略,而你想知道具体修改了什么地方,可以用 git diff
命令,但是此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。 也就是修改之后还没有暂存起来的变化内容。
git diff [filename ]
若要查看已暂存的将要添加到下次提交里的内容,
可以用 git diff --staged 命令。 这条命令将比对已暂存文件与最后一次提交的文件差异:
git diff --staged
这里要说一下,使用git自带的乌龟命令行工具看对比的时候,要怎么退出,使用q键退出:在git diff中,按下键盘上的”q”键即可退出
请注意,git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候你一下子暂存了所有更新过的文件,运行 git diff 后却什么也没有,就是这个原因。
git diff --cached
git diff --cached
查看已经暂存起来的变化( --staged
和 --cached
是同义词):
创建提交
这个命令执行后会反馈当前是在哪个分支(master
)提交的,本次提交的完整 SHA-1 校验和是什么(463dc4f
),以及在本次提交中,有多少文件修订过,多少行添加和删改过,提交时记录的是放在暂存区域的快照。 任何还未暂存文件的仍然保持已修改状态,可以在下次提交时纳入版本管理。 每一次运行提交操作,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。
$ git commit -a -m 'added new benchmarks'
[master 83e38c7] added new benchmarks1 file changed, 5 insertions(+), 0 deletions(-)
普通方式,使用 -m 添加注释
git commit -m
跳过使用暂存区域
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git checkout -- <file>..." to discard changes in working directory)modified: CONTRIBUTING.mdno changes added to commit (use "git add" and/or "git commit -a")
$ git commit -a -m 'added new benchmarks'
[master 83e38c7] added new benchmarks1 file changed, 5 insertions(+), 0 deletions(-)
移除文件
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。
可以用 git rm
命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。
如果只是简单地从工作目录中手工删除文件,运行 git status
时就会在 “Changes not staged for commit” 部分(也就是 未暂存清单)看到:
$ rm PROJECTS.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:(use "git add/rm <file>..." to update what will be committed)(use "git checkout -- <file>..." to discard changes in working directory)deleted: PROJECTS.md
no changes added to commit (use "git add" and/or "git commit -a")
如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f
(译注:即 force 的首字母)。 这是一种安全特性,用于防止误删尚未添加到快照的数据,这样的数据不能被 Git 恢复。
如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项
-f
(译注:即 force 的首字母)。 这是一种安全特性,用于防止误删尚未添加到快照的数据,这样的数据不能被 Git 恢复。
git rm -f
另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。 当你忘记添加 .gitignore
文件,不小心把一个很大的日志文件或一堆 .a
这样的编译生成文件添加到暂存区时,这一做法尤其有用。 为达到这一目的,使用 --cached
选项:
就是删除所有,而且在本地不删除,保留,就是不要让git追踪
$ git rm --cached READMEgit rm 命令后面可以列出文件或者目录的名字,也可以使用 glob 模式。比如:
$ git rm log/\*.log
注意到星号 * 之前的反斜杠 \, 因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开。 此命令删除 log/ 目录下扩展名为 .log 的所有文件。 类似的比如:git rm \*~
该命令会删除所有名字以 ~ 结尾的文件。
指向正确的远程仓库地址
确保 origin
指向正确的远程仓库地址。你可以用以下命令查看配置:
git remote -v
如果 origin
的 URL 有问题,可以使用下面的命令重新设置:
git remote set-url origin <remote-repository-url>
- 操作类型:
(fetch)
表示当你从远程仓库拉取(git fetch
)时会用到这个 URL。(push)
表示当你推送(git push
)到远程仓库时会用到这个 URL。
如果你本地看不到远程分支,用这个更新
git remote add origin
远程分支管理
确保你要推送的分支存在。如果远程仓库中没有 master
分支,可能需要推送到 main
或其他分支。你可以用以下命令查看远程分支:
-
git branch:用于查看本地仓库中的所有分支。执行该命令会显示一个列表,其中包含当前所有的分支,并且当前所在的分支会用"*"表示。
-
git branch -a:a = all,用于查看本地仓库和远程仓库中的所有分支。执行该命令会显示一个列表,其中包含本地所有的分支和远程所有的分支,并且当前所在的分支会用"*"表示。
-
git branch -r:r = remote用于查看远程仓库中的所有分支。执行该命令会显示一个列表,其中包含远程所有的分支。
git remote add uniapp_branch https://gitee.com/charlinheng/github_share.git
命令 git branch -r
用于列出 远程分支,也就是说,它显示的是与远程仓库关联的分支信息。
当前所在分支与远程分支对应
确保你当前所在的分支与远程仓库的分支对应,或者切换到正确的分支:
git checkout <branch-name>
更新同步最新提交
git pull
#如果两个分支的历史记录没有共同的祖先,仍然进行合并。在正常情况下,Git 会拒绝合并两个没有公共祖先的分支,以避免潜在的冲突或问题。使用--allow-unrelated-histories这个选项可以强制 Git 进行合并,通常用在你正在合并两个完全不同历史的仓库或分支时。
git pull master master --allow-unrelated-histories
合并提交
git merge
#将两个分支的更改合并在一起。它会将另一个分支的所有更改整合到当前分支,--allow-unrelated-histories
:这个选项告诉 Git 即使这两个分支的历史没有共同的祖先,也要强制进行合并。在没有这个选项的情况下,Git 会阻止合并两个完全没有共同历史的分支,以避免潜在的冲突或不一致性。
git merge master master --allow-unrelated-histories
移除文件
不像其它的 VCS 系统,Git 并不显式跟踪文件移动操作。 如果在 Git 中重命名了某个文件,仓库中存储的元数据并不会体现出这是一次改名操作。
$ git mv file_from file_to
其实,运行 git mv
就相当于运行了下面三条命令:
$ mv README.md README
$ git rm README.md
$ git add README
。不过在使用其他工具重命名文件时,记得在提交前 git rm
删除旧文件名,再 git add
添加新文件名。
查看提交历史
$ git log
不传入任何参数的默认情况下,git log
会按时间先后顺序列出所有的提交,最近的更新排在最上面。
git log -p
其中一个比较有用的选项是 -p
或 --patch
,它会显示每次提交所引入的差异(按 补丁 的格式输出)。 你也可以限制显示的日志条目数量,例如使用 -2
选项来只显示最近的两次提交:
git log --stat
你也可以为 git log
附带一系列的总结性选项。 比如你想看到每次提交的简略统计信息,可以使用 --stat
选项:
git log --pretty oneline|fuller
这个选项可以使用不同于默认格式的方式展示提交历史。
常用的就是oneline | fuller
git log --pretty=format
最有意思的是 format
,可以定制记录的显示格式。 这样的输出对后期提取分析格外有用——因为你知道输出的格式不会随着 Git 的更新而发生改变:
git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : changed the version number
085bb3b - Scott Chacon, 6 years ago : removed unnecessary test
a11bef0 - Scott Chacon, 6 years ago : first commit
git log --pretty=format 常用的选项 列出了 format
接受的常用格式占位符的写法及其代表的意义。
选项 | 说明 |
---|---|
%H | 提交的完整哈希值 |
%h | 提交的简写哈希值 |
%T | 树的完整哈希值 |
%t | 树的简写哈希值 |
%P | 父提交的完整哈希值 |
%p | 父提交的简写哈希值 |
%an | 作者名字 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(可以用 --date=选项 来定制格式) |
%ar | 作者修订日期,按多久以前的方式显示 |
%cn | 提交者的名字 |
%ce | 提交者的电子邮件地址 |
%cd | 提交日期 |
%cr | 提交日期(距今多长时间) |
%s | 提交说明 |
git log --graph
这种为展示图表模式
commit b9dd7ef50ea004ffd22cc228089cb05d05164971
| Author: hecheng <144***0705@qq.com>
| Date: Thu Nov 28 15:16:46 2024 +0800
|
| remove com name from class info
|
* commit 601e09de5318c38ff7189065eebb8b601146566c
|\ Merge: 67daed7 0a08959
| | Author: hecheng <144***0705@qq.com>
| | Date: Thu Nov 28 15:08:20 2024 +0800
| |
| | solve merge
| |
| * commit 0a08959307cb241af9dc2a18432c4489b5975cc4
| | Author: CharLinHeng <144***0705@qq.com>
| | Date: Mon Nov 25 07:33:07 2024 +0000
| |
| | add LICENSE.
| |
| | Signed-off-by: CharLinHeng <144***0705@qq.com>
| |
| * commit 2aa519dd1a4f4d41eef9e72d815b389cfe1da027 (master/develop)
| Author: CharLinHeng <144***0705@qq.com>
| Date: Mon Nov 25 07:32:42 2024 +0000
|
| Initial commit
|
* commit 67daed7ab58ac71a5fc01e098f01dd00d0640d51
| Author: hecheng <144***0705@qq.com>
| Date: Thu Nov 28 15:01:43 2024 +0800
|
| test upload
|
撤销操作
在任何一个阶段,你都有可能想要撤消某些操作。 这里,我们将会学习几个撤消你所做修改的基本工具。 注意,有些撤消操作是不可逆的。 这是在使用 Git 的过程中,会因为操作失误而导致之前的工作丢失的少有的几个地方之一。
git commit --amend
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend
选项的提交命令来重新提交:
例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
-- 修正的意思
最终你只会有一个提交——第二次提交将代替第一次提交的结果。
Note | 当你在修补最后的提交时,与其说是修复旧提交,倒不如说是完全用一个 新的提交 替换旧的提交, 理解这一点非常重要。从效果上来说,就像是旧有的提交从未存在过一样,它并不会出现在仓库的历史中。 修补提交最明显的价值是可以稍微改进你最后的提交,而不会让“啊,忘了添加一个文件”或者 “小修补,修正笔误”这种提交信息弄乱你的仓库历史。 |
取消暂存的文件
git reset HEAD^ <file-name>
你commmit 了,但是想取消,就用这个,取消单个文件
git reset --hard
丢弃所有未提交的修改,还原最新代码
恢复到上次提交的内容
git stash
通过git stash ---- 通常用这种方法
git stash
git pull
git stash pop
通过git stash将工作区恢复到上次提交的内容,同时备份本地所做的修改,之后就可以正常git pull了,git pull完成后,执行git stash pop将之前本地做的修改应用到当前工作区。
git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。
3-2、放弃本地修改的改法
这种方法会丢弃本地修改的代码,而且不可找回,通常不建议使用这种方式。
单独撤销某个文件变动至上次
单独撤销某个文件的变动,回到上次
git restore xxxx.js
这个跟stash差不多,stash是回滚所有到上次
stash是所有文件
restore是单个文件
从远程仓库中获得数据
git fetch
例子如下: