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、当前跟踪的分支和其他配置信息。