git的命令

发布于:2025-06-24 ⋅ 阅读:(12) ⋅ 点赞:(0)

git的命令

一.git init

git init命令是用来在一个目录中初始化一个新的git仓库。我们可以使用git init命令来开始一个新的git项目,也可以将现有项目转换为git项目。

当我们在一个目录下面执行git init后,就可以对这个目录下的所有文件进行版本控制。我们可以使用git命令(如 git add、git commit等)来管理和跟踪该目录下文件的变化、协作开发以及管理项目的版本历史。

在执行了git init命令后,git会自动在该目录下创建一个名为.git的子目录。.git子目录中含有你初始化git仓库中所有的必须文件,这些文件是git仓库的骨干,也是git进行版本控制所需的所有元数据和对象。

命令格式:

git init

示例:

二.git clone

git clone是一个用于将远程git仓库克隆到本地目录的命令。git clone会复制远程git仓库服务器上的所有文件,而不是仅仅复制完成你工作所需要的文件。

git clone命令可以复制远程仓库的所有文件以及所有文件每一个版本的文件,并在本地创建一个与远程仓库相同的仓库副本。如果服务器的磁盘坏掉,就可以使用本地克隆下来的仓库副本来重建服务器上的仓库。

命令格式:

git clone [options] <仓库地址> [本地目录]

常用参数选项:

--bare:仅克隆裸仓库(不包含工作区)。

--branch或-b <分支名>:指定要克隆的分支,默认是main。

--depth <num>:指定克隆的深度,即只克隆指定数量的提交记录。

--recurse-submodules: 克隆仓库时,同时克隆子模块。

--recursive:用于递归克隆主仓库及其关联的子模块,确保完整获取项目依赖。

示例:

git clone https://gitee.com/fibjs/libgit2.git

如果我们在克隆远程仓库的时候,需要自定义本地仓库的名字,我们可以通过额外的参数指定新的目录名。

git clone https://gitee.com/fibjs/libgit2.git mylibgit2

三.git status

git status是一个用于查看git仓库当前状态的命令。该命令可以用于查看git仓库中的文件处于什么样的状态,它会列出文件的已修改、已暂存、未跟踪等状态信息。

命令格式:

git status [options]

常用参数选项:

--short或-s:简短输出模式,只显示文件名和状态代码;

--branch或-b:只显示当前分支的信息;

--untracked-files或-u:显示未跟踪的文件,默认情况下不显示;

--ignored: 显示被忽略的文件。

示例:

git status

示例中的输出信息:“On branch main”是说当前的分支是main。“Your branch is up to date with 'origin/main'.” 表明当前本地分支与远程仓库的对应分支(origin/main)在‌最后一次同步时版本一致,就是说本地这个分支同远程服务器上对应的分支没有偏离。“nothing to commit, working tree clean”说明当前现在的工作目录相当干净。换句话说,所有已跟踪文件在上次提交后都未被更改过。

四.git add

git add命令是用于将文件或目录的更改添加到暂存区,以便于对文件进行跟踪。该命令是用于对git仓库中文件的新增、修改、删除等操作进行跟踪和管理,但这些文件的更改操作并没有通过git add命令直接提交到版本库。

git add命令其实是告诉git仓库中哪些文件的更改应该包含在下一次提交(git commit)中。它可以理解为是为下一次提交(git commit)做准备工作。对于文件的变动只有在对该文件执行了git add命令后,才能被提交(git commit)到版本库中。

git add 命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。

命令格式:

git add [options] <path>

这里的参数path可以是文件名、目录名、通配符、也可以是.。git add .表示将当前目录下的所有新增和修改的文件添加到暂存区,但是不包括删除的文件。

常用参数选项:

-u或--update:表示只将已跟踪的修改和删除的文件添加到暂存区,但不会把新增的文件添加到暂存区;

-A或--all:表示将所有新增的文件和已跟踪修改,删除的文件都添加到暂存区。

示例:

我们在libgit2目录下创建了一个内容为“123”的test文件,通过git status命令输出信息可以看出test文件此时处于未跟踪的状态。

当我们执行git add test命令后,再通过git status命令可以看出,此时的test文件已经被放入了缓存区。

然后当我们再对test文件追加了内容”456“后,通过git status命令查看,可以发现此时的test文件同时出现在了暂存区和非暂存区。

如果此时我们提交(git commit)test文件,那么提交到git仓库test文件是只包含内容”123“的文件。这个版本是我们第一次执行git add test 命令时之前的test文件。若要把追加了内容”456“的test文件也提交到git仓库。我们还需要再次执行git add test 命令。

我们通过git status命令可以看出现在test文件只出现在了暂存区。现在执行提交(git commit),内容是“123456“的test文件会被提交到了本地git仓库。

五.git commit

git commit命令用于创建一个新的提交。git commit命令将暂存区中文件的变动提交到本地git仓库中。每次提交都会生成一个版本快照并会产生一个唯一的哈希值。

git提交时会记录文件的状态、作者、提交备注以及提交时间等元数据信息。开发者在需要时可以查看、恢复、比较文件的历史版本。

命令格式:

git commit [options] <path>

常用参数选项:

-a或--all:会跳过git add操作,将已经跟踪修改或删除的文件添加到暂存区并直接提交到本地git仓库中;

-m或--message:用于指定提交的信息,-m参数会避免打开编辑器输入信息的步骤。如果给定了多个-m选项,它们的值会作为单独的段落串联起来;

--amend:用于修改最后一次提交。该参数上一次提交的信息替换为新的提交信息,并更新提交内容。它主要是为了更正提交信息或将遗漏的文件包含在提交中;

--no-edit:不改变上一次的提交信息,只更改上一次提交的内容,可以和--amend参数一起使用;

--author=<提交人>:为当前的提交指定作者信息;

--date=<日期>:为当前的提交指定时间的参数,该参数允许用户手动设置提交记录的时间。

示例:

git commit -m "this is my first commit."

我们先在libgit2目录下创建一个内容为”qwe”的test文件,然后通过git add 命令将这个test文件加入暂存区。最后使用git commit –m 将这个test文件提交。提交后,git会返回当前是在哪个分支(main)提交的,本次提交的完整SHA-1校验和(539d65834),以及在本次提交中,有多少文件修订过,多少行添加和删改过。

文件在提交后,我们使用git status 看出以前在暂存区的需要提交test文件已经不见了。现在已经没有再需要提交的文件了。

六.git reset

git reset 是一个用于撤销更改或回退版本的命令。它主要通过移动HEAD指针来实现不同级别的回退操作。

通过 git reset命令我们可以恢复工作区、暂存区或历史记录中的文件状态。该命令适用于撤销本地未推送的某些提交、取消文件的暂存、或者将工作区恢复到某个特定的版本。

命令格式:

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

常用参数选项:

--mixed:为默认选项。重置HEAD指针,该参数会撤销暂存区中的文件变化,使暂存区的内容恢复与上一次提交的内容保持一致,但工作区文件内容保持不变。

--soft:是一个软重置,仅移动HEAD指针,不修改暂存区和工作区文件的内容。该参数主要是用于合并多个提交,修改最近一次提交等。

--hard:是最彻底的重置模式。该选项会彻底丢弃本地的更改,把工作目录和暂存区的文件都重置为指定的提交。该选项的重置操作不可恢复,需要谨慎使用。

HEAD: HEAD是当前分支引用的指针,它总是指向该分支上的最后一次提交。HEAD也是下一次提交的父结点。HEAD是可以看做是该分支上的最后一次提交的快照。。

我们可以HEAD^n或者HEAD~n 来代表每个版本。例如:

HEAD 表示当前版本

HEAD^ 上一个版本

HEAD^^ 上上一个版本

HEAD^^^ 上上上一个版本

以此类推...

或者

HEAD~0 表示当前版本

HEAD~1 上一个版本

HEAD^2 上上一个版本

HEAD^3 上上上一个版本

以此类推...

示例:

示例中我们新增了一个内容为“123”的test文件,通过git status命令可以看出新增的test文件还处于未跟踪的状态。再通过git add命令对test文件进行跟踪,把文件加入暂存区。

我们使用git reset --soft HEAD命令进行重置后,发现在位于暂存区的test并没有发生什么变化,只是撤销最近的一次提交。

我们使用git reset HEAD test对test文件进行重置操作的话,可以发现在以前位于暂存区中的test文件,现在已经被还原成未跟踪的状态。git reset HEAD test等价于git reset --mixed HEAD test命令,因为mixed是默认选项。

我们再次把test文件加入到暂存区,最后对test文件进行提交,提交的信息为“this is test”。

我们对README.md文件追加内容“123”,现在README.md文件已经处于了暂存区了。现在的情况是我们提交了一个test文件位于工作区,修改了一个README.md文件位于暂存区。

我们使用git reset --hard HEAD^命令来重置到上一个版本后,可以发现README.md文件已经不在暂存区了。上次提交的test文件也不在本地工作区了。通过git log命令,发现上次对test文件的提交信息也不存在了。

七.git branch

git branch是一个用于管理分支的命令,该命令可以用来创建、查看、列出、重命名、删除以及切换分支。

命令格式:

git branch [options] [branch-name]

常用参数选项:

-l或--list:罗列出分支;

-a或--all:列出远程跟踪的分支和本地分支;

-d或--delete:删除分支,这个分支必须要完全合并在其上游分支中;

-D:强制删除一个分支,即使该分支没有被合并。该参数等价于--delete --force;

-r或--remotes:列出远程仓库的分支;

-v:查看分支的最后一次提交信息;

-m或--move:重命名分支名称;

--merged:显示已经与当前分支合并的所有分支。

示例:

git branch -l -a

git branch -l –a命令罗列出所有本地和远程的分支。

git branch 或git branch –l

git branch 或git branch –l是专门列出本地分支。

git branch -r

git branch -r 是专门用于列出远程分支。

git branch t1

示例中我们创建一个名称为”t1”的分支。可以使用git checkout命令切换到这个新建的分支。

git branch –merged

以上示例中列出了已合并到当前分支的所有本地分支

git branch -m t1 t2

git branch命令中我们使用-m的参数可以把分支t1的名称改为t2。

git branch –v

通过git branch –v命令可以查看本地分支及其最后一次的提交信息。

git branch -d t2

使用git branch -d t2命令可以删除t2这个分支。

八.git revert

git revert是一个用于撤销历史提交的命令。相较于git reset,git revert不会直接修改git的提交历史,它会创建一个新的提交来“反向应用”指定提交的更改,从而实现撤销该提交的效果。

git revert不会改变历史提交记录,它会保持提交历史的线性,是一个安全的操作,适合用于已推送提交的撤销。

命令格式:

git revert [options] <commit>

常用参数选项:

-e或--edit:该选项是手动编辑提交信息,通常用于当你需要详细描述撤销操作时;

--no-edit:使用该选项后,将不会启动提交信息的编辑器;

-n或--no-commit:执行撤销操作,但不会提交,而是将更改保留在工作区和暂存区。

示例:

git revert --no-edit HEAD

示例中使用git revert命令撤销了最近的一次提交。

九.git restore

git restore命令是用于恢复或撤销文件的更改。git restore是git 2.23版才引入的命令。该命令可以撤销对工作区文件的修改,把文件恢复到某个提交的状态,或者可以将暂存区的文件恢复到工作区中。

相较于git reset命令,git restore只关注操作文件本身,目的是让文件内容回到某个已知状态。但它绝不会移动HEAD指针或修改已存在的提交历史。git restore命令是一个更安全、更专注于文件恢复的命令。

命令格式:

git restore [options] <file>

常用参数选项:

-W或--worktree:是默认选项。只恢复将工作区中被修改的文件恢复到指定状态。

-S或--staged:撤回暂存区中的文件到工作区,但是文件的内容不会被改变,只是取消了它们的暂存状态。一般是对git add命令的撤回操作。

-s <commit>或--source=<commit>:从指定的提交来恢复文件内容。提交默认为HEAD,提交还可以是哈希、分支名或标签。

示例:

我们在README.md文件中追加了“123”的内容,git status命令输出提示可以看出,此时工作区的README.md内容已经修改,我们要么通过git add命令将README.md文件加入暂存区后提交,要么使用git restore命令恢复文件。本示例我们使用git restore命令恢复文件。

通过git restore -W README.md命令我们可以将工作区中的README.md文件进行恢复。通过查看文件,可以发现先前追加的“123”内容已经被撤销掉了。

我们还是在README.md文件中追加内容“123”,并且通过git add命令将这个文件添加到暂存区。

我们使用git restore -S README.md命令,将README.md文件从暂存区撤回到工作区中。但是追加到README.md文件的内容“123”还是存在。

我们再次把README.md文件加入暂存区后并提交。此时文件已经提交到了本地的git仓库,如果我们想把README.md文件恢复到没有追加内容“123”的那个版本。可以使用git restore -s <commit>这个命令把文件回到上一个提交的版本即可。

上述示例中我们通过git restore -s HEAD^1 README.md命令把README.md文件恢复到了上一个提交版本。此时README.md文件位于工作区,并且追加的内容“123”已经没有了。

十.git switch

git switch是一个专注于切换分支的命令,它是Git2.23引入的,旨在替代git checkout的部分功能,使切换分支操作更加简化和清晰。

命令格式:

git switch [options] [branch-name]

常用参数选项:

-c或--create:创建一个新分支,并切换到该分支;

-f或--force:强制切换,丢弃未提交更改。

示例:

git switch t1

上面示例中,我们创建了t1分支后,使用git switch命令切换到了t1的分支。

git switch -c t2

我们使用git switc -c命令创建了t2分支,并切换到了这个分支。

十一.git checkout

git checkout命令主要是用于切换分支、恢复文件、创建新分支等操作。在git 2.23版本后引入了git switch和git restore命令,分别用于分支切换和文件恢复。这两个命令可以在一定程度上代替git checkout操作。

命令格式:

git checkout [options] <分支名或提交哈希> [filepath]

常用参数选项:

-b:创建并切换到新分支;

-B:从起点开始创建分支新分支,如果分支已经存在,则重置为起点;

-t:用于跟踪远程分支并切换到该分支;

-f:用于强制切换分支或恢复文件。

示例:

git checkout t1

我们使用git checkout命令从main分支切换到了t1分支。

git checkout -b t2

上述示例中我们使用了git checkout-b命令创建了一个t2的新分支并切换到了这个t2分支。

git checkout -

我们可以使用git checkout –命令切换到前一个分支,上述示例中我们从t2分支切换到了t1分支。

git checkout -- README.md

上述示例中,我们使用echo命令在README.md文件的末尾追加了内容”123”。我们使用 git checkout -- README.md命令可以把README.md文件的内容恢复到最新提交的版本,此时查看README.md文件,会发现追加的内容”123”已经不见了,我们在工作区修改的内容已经丢失。

十二.git diff

git diff命令是一个用于比较文件差异的核心命令。它可以比较工作区、暂存区(Stage)和提交历史之间的文件差异。

命令格式:

git diff [options] [file,commit, branch]

常用参数选项:

--staged或--cached:用于比较暂存区与最新提交之间的差异;

--color:显示有颜色的差异;

--name-only:仅显示有差异文件的文件名;

--stat:显示差异的统计信息;

--word-diff:用于单词级别的差异。

示例:

git diff

以上示例中,我们在README.md文件中追加内容“123”。然后使用git diff命令来显示工作区和暂存区变动文件的差异。示例中输出了工作区和暂存区中README.md文件的内容中有“123”的变化。

git diff HEAD README.md

我们可以使用HEAD参数,来显示工作目录(包含暂存和未暂存的修改)与最新提交(HEAD指向的提交)的差异。

git diff --staged README.md

上述示例中,我们把README.md文件加了暂存区,然后使用了git diff --staged README.md的命令来查看暂存区和最新提交README.md文件的差异。

我们对README.md进行了提交,此时我们还可以使用git diff 命令来比较两次提交的文件差异。

十三.git log

git log是用于查看项目提交历史的命令。git log命令会按时间倒序罗列出当前分支的提交记录。提交记录中包含了SHA-1校验和、作者的名字、电子邮件、提交时间、提交说明等信息。

命令格式:

git log [options]

常用参数选项:

-p或--patch:显示每次提交所引入的差异

--stat:显示每个提交变更统计信息

--pretty:使用自定义格式显示提交历史信息。oneline‌:单行显示简短的哈希值和提交信息;short:显示哈希、作者和消息摘要;full:包含完整哈希、提交者信息及变更文件列表。fuller:包含完整哈希提交者信息、变更文件列表,提交时间和作者时间。format:常用格式占位符的写法

--oneline:以简洁一行的格式显示哈希值和提交信息,等价于--pretty=oneline。

--since=<时间>:只显示指定时间之后的提交信息。

--until=<时间>:只显示指定时间之前的提交信息

--author=<name>:显示由指定作者提交的提交信息。

-<n>:仅显示最近的n条的提交信息。

示例:

git log -2

我们使用了git log -2显示了最近的两条提交信息。

git log --pretty=oneline -3

上述例子中我们以单行简短的形式,显示了近三次提交的哈希值和提交信息。

十四.git rm

git rm是从git版本控制系统中移除文件的命令。它可以从工作区和暂存区中删除文件,并将删除的操作记录到git历史中。

命令格式:

git rm [options] <file or directory>

常用参数选项:

-f或--force:强制删除文件,即使文件已修改但未提交;

--cached:仅从暂存区域移除文件,但文件仍然留在本地的工作目录中;

-r或--recursive:递归删除目录及内容。

示例:

git rm README.md

示例中我们使用了git rm 命令删除了README.md文件。执行该命令后README.md文件不仅从本地工作目录中删除,也已经从已跟踪文件清单中移除掉了。此时还没有提交,我们可以使用git restore命令对README.md文件进行恢复。

git rm --cached SECURITY.md

我们使用了—cached参数来删除SECURITY.md文件,会发现SECURITY.md文件任然保留在当前工作目录中,它只是从git的跟踪文件清单中移除了。--cached参数的作用是相当于仅仅把文件从暂存区移除。

十五.git mv

git mv命令是用于在git仓库中移动或重命名一个文件、目录或软连接。

命令格式:

git mv [options] <source>…​ <destination>

常用参数选项:

-f或--force:即使目标文件存在,也强制重命名或移动文件;

-n或--dry-run:模拟文件移动或重命名操作的操作,并不实际执行;

-v或--verbose:执行文件移动或重命名操作时,显示具体执行了哪些操作详细的信息。

示例:

git mv SECURITY.md SECURITY.bak

  

git mv SECURITY.bak tests/

十六.git tag

git tag是一个用于管理标签的命令。该命令可以创建、列出、删除和验证标签。标签通常用于标记一个特定的提交,主要是标记项目的重要版本发布点或里程碑。

git标签分为两种类型:

  轻量标签(Lightweight Tag):它只是提交的一个引用,不包含额外的元数据。

  附注标签(Annotated Tag):它包含作者信息、日期、描述信息,并且可以签名,是一种更有描述性的标签。

命令格式:

git tag [options] [标签名称][提交哈希值]

常用参数选项:

-l或--list:用于罗列出标签,支持通配符匹配;

-a或--annotate:用于创建附注标签;

-m或--message:在创建附注标签时添加注释信息,通常与-a参数配合使用;

-d或--delete:删除本地标签。

示例:

git tag

我们使用git tag命令罗列出了当前项目的所有标签。如果我们只想查看某一类的标签可以使用配符匹配。

git tag -l "v0.21.*"

git tag -a v-test -m "this is a test"

上面的示例中,我们创建一个名称为”v-test”的附注标签,并使用-m参数指定了存储在标签中的信息。

git tag v-test-lw

我们继续创建了一个名称为” v-test-lw”的轻量标签,轻量标签本质上是将提交校验和存储到一个文件中,但是没有保存任何其他的信息。

git tag -d v-test 
git tag -d v-test-lw

我们在git tag命令中使用了-d的参数选项,将附注标签”v-test”和轻量标签” v-test-lw”在本地进行了删除的操作。

十七.git merge

git merge是git中用于合并分支的命令,它可以将一个或多个分支的更改合并到当前分支中。该命令通常用于在功能开发完成后,将开发分支的内容合并到主分支上。

命令格式:

git merge [options] <branch-name>

常用参数选项:

--ff-only:用于严格控制合并方式,它强制要求合并必须是快进合并,否则直接拒绝合并操作。它是一个安全导向的合并策略;

--no-ff:用于强制创建合并提交的命令,即使当前分支可以直接快进(Fast-Forward)到目标分支。这种方式会保留分支的历史信息,清晰展示分支的合并过程;

--squash:将被合并分支的所有提交压缩为一个提交,不保留分支历史;

-s或--strategy:指定合并时使用的策略,默认策略为recursive。

示例:

git merge main

我们创建了”t1”的分支并切换到这个分支,如果主分支”main”上有一些改动,我们需要合并到”t1”分支,就可以在”t1”分支上使用git merge main的命令。

十八.git fetch

git fetch命令用于从远程仓库或者远程分支获取更新到本地,但不会把更新自动合并到本地当前分支。我们可以使用该命令来查看远程仓库的最新状态。

命令格式:

git fetch [options] [remote][branch-name]

常用参数选项:

--all:获取所有已配置远程仓库的更新,默认是从origin远程仓库获取所有分支的更新;

-p或--prune:清理本地存储的、远程仓库中已不存在的分支引用;

-v或--verbose:显示详细操作日志信息;

-t或--tags:获取远程仓库的所有标签信息;

--depth=<n>:限制获取的历史深度,仅获取最近的n次提交。

示例:

git fetch

git fetch命令等价于git fetch origin,都是从远程仓库获取所有分支的更新。若只需要获取某单个分支的更新,则需要在git fetch origin命令后,加上分支名称即可。

git fetch origin cmn/diff-binary-patch

十九.git pull

git pull命令用于从远程仓库或者远程分支的更新获取到本地,并把更新自动合并到当前的分支。该命令相当于git fetch和git merge这两个命令的组合。

命令格式:

git pull [options] [remote][branch]

常用参数选项:

-r或--rebase:用变基来代替合并,而不是直接创建一个合并提交。该选项会将拉取的远程提交放在本地提交之前,来代替默认的合并操作;

这样可以保持线性的提交历史,避免产生不必要的合并提交;

-f或--force:强制拉取更新并覆盖本地修改;

--ff-only:仅允许进行快进(fast-forward)合并操作,若合并发生冲突则操作失败;

--no-ff:禁止进行快进合并,强制生成新的合并提交;

-v或--verbose:显示拉取过程详细的日志信息。

示例:

git pull -v origin

二十.git push

git push命令用于将本地仓库的提交推送到远程仓库,能够让团队成员共享你的代码更新。

命令格式:

git push <远程仓库名> <本地分支名>:<远程分支名>

常用参数选项:

-f或--force:强制推送,通常用于覆盖远程仓库中的历史提交,团队协作中慎用;

-u或--set-upstream:首次推送时建立本地分支与远程分支的关联关系,之后推送可以直接使用git push而不需要指定远程和本地分支;

-d或--delete:用于删除远程仓库的某个分支;

--tags:用于将本地所有标签(tags)同步到远程仓库。

二十一.git remote

git remote是git中用于管理远程仓库的命令,主要功能包括查看、添加、删除和修改远程仓库的信息。

命令格式:

git remote [options] [cmd]

1.查看远程仓库

git remote

列出当前仓库中已配置的远程仓库。

git remote –v

列出当前仓库中已配置的远程仓库名称、fetch和push的url地址等信息。

2.添加远程仓库

git remote add test https://github.com/test.git

git remote add命令可以指定新的远程仓库的名称和URL,并将其添加到当前仓库中。

3.修改远程仓库URL

git remote set-url test https://github.com/new-test.git

git remote set-url命令可以修改指定远程仓库的URL地址。

4.重命名远程仓库

git remote rename test new-test

git remote rename命令可以修改指定的远程仓库的名称。

5.删除远程仓库

git remote remove new-test

git remote remove命令从当前仓库中删除指定的远程仓库。

6.查看远程仓库详情

git remote show origin

git remote show命令用于显示指定远程仓库的详细信息,包括该远程仓库的URL、当前跟踪的分支和其他配置信息。


网站公告

今日签到

点亮在社区的每一天
去签到