Git常用命令介绍

Git常用命令介绍

本文只包含 W3c:Git官方文档涉及到的命令。

Resoure

这部分就不说了。

Create Git/创建 Git

创建一个git仓库。

From existing directory

如果想在本地文件夹中创建一个仓库

bash 复制代码
cd project_dir
git add .
git init

From other repository

如果想使用已有的仓库

bash 复制代码
# clone一个本地存在的仓库
git clone existing_dir new_dir
# clone一个远程仓库,两者区别在于引用地址的方式不同,前者是ssh,后者是https。
git clone git://github.com/user/repo.git
git clone https://github.com/user/repo.git

Local Changes/查看本地变化

查看本地的变化

Changed in working directory

bash 复制代码
git status

查看工作区的变化,输出:

bash 复制代码
# 当前所在分支
On branch master 

# 当前分支的状态:
## 情况一:表示最新的分支
Your branch is up to date with 'origin/master'.
## 情况二:可能会发生冲突
Your branch is ahead of 'origin/master' by 1 commit.
  	(use "git push" to publish your local commits)
  	
# 提交状态
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
	modified:   README.md #### 表示修改
    delete:   ... #### 表示删除 
    new file:   test.js #### 表示新增
    
# 暂存区状态
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
	## 修改时:
	modified:   README.md
	## 删除时:
	deleted:   README.md
	## 新增时:
	Untracked files:
		README.md

Tracked file changes

比较工作区与暂存区的变化

bash 复制代码
git diff

比较指定文件工作区和缓存区的变化:git diff -- filePath

比较暂存区和本地库最近一次commit内容:git diff --cached

比较工作区与本地最近一次commit内容:git diff HEAD

比较两个commit之间差异:git diff [first-branch] [second-branch],详见:

bash 复制代码
# 1. 获取提交以及上传内容的版本号
>> git reflog
4cf2d2b (HEAD -> master) HEAD@{0}: commit: commit-2
c23f3ff HEAD@{1}: commit: commit-1
ade28e2 HEAD@{2}: commit: test
2c60606 (origin/master, origin/HEAD) HEAD@{3}: clone: from C:/Users/Lenovo/Desktop/gogogo-start/./vue-learning
# 2. 比较
>> git diff c23f3ff ade28e2

Add changed files

添加文件的更改到暂存区

bash 复制代码
# 添加指定更改了的文件到暂存区
git add file1 file2 file3
# 添加所有文件的更改到暂存区
git add .

Remove file

删除工作区的文件

bash 复制代码
git rm dir/ -r
	(recursive under directory)
git rm file

Commit changes

提交文件的更改到本地仓库

bash 复制代码
git commit
git commit -a -m "My Message"
	(tracked files only, auto add)
git commit -m "My message"
  • 使用git commit [file...]之后,git将会开启编辑器让你输入此次提交的提交信息。提交信息中的首行若是以#开头,则该行在提交时会被忽略。
  • -a 添加所有已跟踪文件,将所有处于已跟踪状态的文件提交,但是未跟踪的文件并不会被提交。编辑器仍旧会进入编辑模式,让你输提交信息。
  • -m 直接写入提交信息,不会进入编辑器。

Change last commit

更改上一次的提交

bash 复制代码
git commit --amend

使用场景:

在一些受管控的项目上,提交代码到 git 服务器后,还需要经过审核确认才正式合入版本,一般常用 gerrit 来进行审核确认操作。

如果提交的代码审核不通过,需要再次修改提交。由于是修改同一个问题,我们可能不希望生成多个 commit 信息,会显得改动分散,看起来改动不完善,所以想要在本地已有的 commit 信息上再次提交改动,而不是在已有的 commit 上再新增一个 commit。

使用 git commit --amend 命令可以达到在现有最新 commit 上再次提交改动的效果。

在本地提交改动后,我们再次修改代码,执行 git add 命令添加改动,如果执行 git commit -m 命令,默认会创建新的空 commit 信息,填写相应的修改说明,提交之后,会新增一个 commit 信息;而执行 git commit --amend 命令会弹出当前最新 commit 的信息,我们可以修改这个信息,也可以不修改,提交之后,用 git log 命令查看,会看到没有增加新的 commit,原先 commit 的 hash 值也没有变,这一次的修改是跟之前的修改一起提交的。

引自:kingjay

Revert changes to file

撤销工作区的修改

bash 复制代码
git checkout -- file

Revert changes (new commit)

恢复更改(新提交)

bash 复制代码
git revert HEAD

作用:git revert 是 Git 中用于撤销一个或多个提交的命令,但是会保留历史记录。它创建一个新的提交,该提交是对原提交的相反操作,以撤销原提交的更改。通过 git revert 撤销提交,可以保持历史记录的完整性,不会修改已经共享的提交历史。

语法:git revert <commit-hash1> <commit-hash2>

撤销单个提交:git revert <commit-hash1>

撤销多个提交:git revert <commit-hash1> <commit-hash2> ...

撤销最近的提交:git revert HEAD

撤销某个范围的提交:git revert <commit-hash>^...<commit-hash2>,范围左开右闭。

通过 git log查看commit 哈希码

注:撤销的每一个提交都对应着创建一个新的提交。

Return to last committed state

返回到上一次提交的状态

bash 复制代码
git reset --hard HEAD

作用:移动 HEAD 指针并可选地更改暂存区和工作目录的状态。它是一个非常强大的工具,常用于撤销提交、取消暂存文件、修改提交内容等操作。

语法:git reset --(soft|mixed|hard) <HEAD~(num)>

--hard 回退全部(HEAD,index,working tree),这会将HEAD指向的分支的最新提交撤销掉,暂存区和工作区的文件的所有更改都将丢弃。相当于回到了上一个提交的状态。

--mixed 回退部分(HEAD,index),这会将HEAD指向的分支的最新提交撤销掉,暂存区的所有文件更改都将丢弃,但工作区的文件的更改不会变化。

--soft 只回退 (HEAD),HEAD指向的分支的最新提交撤销掉,但不会覆盖工作区的更改。

History/查看历史记录

Show all commits

查看所有的提交历史记录

bash 复制代码
git log

Short Format

以短格式的形式显示

bash 复制代码
git log --pretty=-short

--pretty 指定输出格式,例如:简洁模式--pretty=oneline 短格式--pretty=short 完整格式--pretty=full 自定义格式(--pretty=format:"..."

Patches

查看所有的提交历史记录,包括diff

bash 复制代码
git log -p

例:

bash 复制代码
commit ade28e2acca022ff24a212818ce72df2bf5b9030
Author: 0Blue <1790280415@qq.com>
Date:   Sat Aug 10 19:46:01 2024 +0800

    test

diff --git a/README.md b/README.md
index e69de29..fbd2fe8 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1 @@
+### 
\ No newline at end of file

Show file commits

查看某个文件的提交历史记录

bash 复制代码
git log file

Show directory commits

查看某个文件夹的提交历史记录

bash 复制代码
git log dir/

Stats

查看所有的提交历史记录,并统计每次提交的更改

bash 复制代码
git log --stat

例:

bash 复制代码
commit 43ce6d0dfba5f4c4259da4242ccae6e5282940d9 (HEAD -> master)
Author: 0Blue <1790280415@qq.com>
Date:   Sun Aug 11 17:09:42 2024 +0800

    Revert "3"
    
    This reverts commit 351101ac9dba2124bfabaacf780d77f439c0f6cc.

 README.md | 10 +---------
 test.js   |  0
 2 files changed, 1 insertion(+), 9 deletions(-)

Who changed file

查看文件的修改历史记录,包括时间、作者以及内容

bash 复制代码
git blame file

例:

bash 复制代码
c23f3ffc (0Blue 2024-08-11 16:00:04 +0800 3) 又新增了一行

Merge/Rebase 合并

Merge branch into current

当前分支与指定分支合并

bash 复制代码
git merge branch

例:

bash 复制代码
git checkout develop
git merge feature/daohang
# 或者:
git merge feature/daohang develop

Rebase into branch

bash 复制代码
git rebase branch
git rebase master branch

作用:将多个commit记录合并为一条

例:-i 指定要合并的那一条记录的上一条 commitId

bash 复制代码
git rebase -i HEAD~4

或者使用commitId

bash 复制代码
git rebase -i e88835de905ad396f61a0dc8c040a8ac8a34f3f8

此时进入rebase交互式终端,如下:

bash 复制代码
pick ade28e2 test
pick c23f3ff commit-1
pick 351101a 3
pick 43ce6d0 Revert "3"

# Rebase 2c60606..43ce6d0 onto 2c60606 (4 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
#                    commit's log message, unless -C is used, in which case       
#                    keep only this commit's message; -c is same as -C but        
#                    opens the editor
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')       
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified); use -c <commit> to reword the commit message
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.

注释对关键字进行了说明,pick:使用这次的commit

squash:使用commit,但合并到以前的commit中

d/drop:移除这一次提交

我们想合并最近4条到最后一条中,则修改成如下并 wq 保存退出。

bash 复制代码
s ade28e2 test
s c23f3ff commit-1
s 351101a 3
pick 43ce6d0 Revert "3"

接着会进入到另一个交互式终端,如果commit message 无异议可以直接 wq 保存退出

Abort rebase

放弃之前rebase的操作

bash 复制代码
git rebase --abort

Merge tool to solve conflicts

合并工具,以解决冲突,详情配置请看:

bash 复制代码
git mergetool

To view the merge conflicts

查看合并冲突

bash 复制代码
# against base file
git diff --base $file
# against your changes
git diff --ours $file
# against other changes
git diff --theirs $file

To discard conflicting patch

丢弃冲突的补丁

git rebase --skip
git reset --hard

After resolving conflicts

在解决冲突后的继续执行

bash 复制代码
git add $conflicting_file
# do for all resolved files
git rebase --continue

Remote Update / Publish 远程更新/发布

List remotes

查看远程仓库地址

bash 复制代码
git remote -v

Show information

查看指定远程仓库的详细信息

bash 复制代码
git remote show remote

例:git remote show origin

Add remote

用于将一个新的远程仓库添加到你的 Git 项目中

bash 复制代码
git remote add path/url

git remote add <name> <path/url>

name 是你为远程仓库指定的名称,path/url 是远程仓库的路径或URL。例:

git remote add origin https://github.com/username/repository.git

Fetch changes

从指定的远程仓库中获取最新的提交和数据,但不会合并这些更改到你当前的工作分支

bash 复制代码
git fetch remote

语法:

git fetch remote <branch-name>:<local-branch-name>

  • remote 远程主机名
  • branch-name 要拉取远程分支名
  • local-branch-name 本地分支名

例:当我们想在远程仓库的一个分支上开发一个新需求时:

git fetch origin feature/template:feature/template_layout

此时,工作目录下,就会有feature/template_layout,在当前分支开发,完成后上传分支。

Feth + merge

拉取远程分支并合并指定分支的更改到当前分支

bash 复制代码
git pull remote branch

Publish local to remote

将本地分支推送到远程仓库

bash 复制代码
git push remote branch

Delete remote branch

删除远程分支

bash 复制代码
git push remote :branch

删除Git本地分支:注意,删除本地分支不会删除远程分支。

bash 复制代码
git branch -d "branch name"
# 或者
git branch --delete <branch>

删除Git远程分支:删除了远程仓库的分支,但其引用仍然存在于团队成员的本地代码仓库中。

bash 复制代码
git push remote -d "branch name"
# 或者
git push <remote_name> --delete <branch_name>
# Git版本早于1.7.0版本适用如下命令:
git push <remote_name> :<branch_name>

如果还想删除本地引用,如右:git remote prune origin删除远程上不存在的分支的引用。

Publish tags

bash 复制代码
git push origin/upstream --tags

Branching/Tagging 分支

这里推荐一篇文章,帮助我们更好的理解分支。

Git从安装到基本使用(保姆教程)

List branches

查看本地分支

bash 复制代码
git branch

Switch to branch

从当前分支,切换到其他分支

bash 复制代码
git checkout branch

创建并切换到新建分支

bash 复制代码
git checkout -b branch

Delete branch

删除分支

bash 复制代码
git branch -d branch

Tag current commit

用于在 Git 仓库中创建一个新的轻量级标签,标签是 Git 中用于标记特定提交的一种机制。它通常用于标记某个重要的里程碑,如发布版本号等。

bash 复制代码
git tag tagname

Useful Commands 有用的命令

Finding Regressions

使用二进制搜索查找引入错误的提交,这个命令使用二分搜索算法来查找项目历史中哪个提交引入了一个错误。

bash 复制代码
# $id is a broken version
git bisect bad $id
# to mark it as bad or good
git bisect bad/good
# $id is the last working version
git bisect good $id
# once you're done
git bisect reset
# to start
git bisect start
# to launch gitk and mark it
git bisect visualize

:假设你想找到破坏了一个已知在你的项目的 v2.6.13-rc2 版本中工作的特性的提交。你启动了一个 bisect 会话,如下所示:

bash 复制代码
git bisect start
git bisect bad                 # 当前版本是坏的
git bisect good v2.6.13-rc2    # v2.6.13-rc2 已知为好

一旦你指定了至少一个坏的和一个好的提交,git bisect 就会在这个历史范围的中间选择一个提交,检查它,并输出类似于以下的内容:

bash 复制代码
Bisecting: 675 revisions left to test after this (roughly 10 steps) | 在这之后,还有675次修订需要测试(大约10步)

你现在应该编译检出的版本并进行测试。如果该版本工作正常,请输入

bash 复制代码
git bisect good

如果该版本被破坏,请输入

bash 复制代码
git bisect bad

然后,git bisect会做出如下反应:

bash 复制代码
Bisecting: 337 revisions left to test after this (roughly 9 steps) | 在这之后还有337个修订要测试(大约9个步骤)。

不断重复这个过程:编译树,测试它,根据它是好是坏,运行 git bisect goodgit bisect bad 来要求下一个需要测试的提交。

最终,将没有更多的修订可以检查,该命令将打印出第一个坏提交的描述。引用 refs/bisect/bad 将被留在该提交处。

Check for Errors and Cleanup Repository

检查错误和清理存储库

bash 复制代码
# 验证数据库中对象的连接性和有效性
git fsck
# 清理不必要的文件,优化本地仓库
gc --prune

在工作目录中搜索foo()

bash 复制代码
git grep "foo()"

结尾!!

相关推荐
待磨的钝刨5 分钟前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
逐·風3 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
Devil枫4 小时前
Vue 3 单元测试与E2E测试
前端·vue.js·单元测试
尚梦4 小时前
uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
前端·小程序·uni-app
GIS程序媛—椰子5 小时前
【Vue 全家桶】6、vue-router 路由(更新中)
前端·vue.js
前端青山5 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
毕业设计制作和分享5 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
从兄6 小时前
vue 使用docx-preview 预览替换文档内的特定变量
javascript·vue.js·ecmascript
晓理紫6 小时前
使用git lfs向huggingface提交较大的数据或者权重
git
清灵xmf7 小时前
在 Vue 中实现与优化轮询技术
前端·javascript·vue·轮询