git操作手册
git工作原理/流程
- Workspace:工作区
- Stage Area:暂存区/缓存区
- Local Repository:本地仓库
- Remote Repository:远程仓库
Git 简单流程的详细解释:
- 工作目录修改和
git add
: 当你在本地的工作目录中进行了文件的修改,例如编辑文件内容或添加新文件,这些更改会处于未跟踪(untracked)状态。通过运行git add
命令,你可以将这些更改添加到暂存区(也叫索引),准备好下一步的提交。 - 提交到本地仓库和
git commit
: 一旦你将更改添加到暂存区,你可以运行git commit
命令来创建一个新的提交(commit)。提交是 Git 中的一个快照,它包含了你在暂存区中添加的更改。每个提交都有一个唯一的标识符(SHA-1 值),以及一个提交消息,用于描述你的更改。提交后,暂存区和工作目录将会清空,准备接受下一轮的修改和提交。 - 将本地提交推送到远程仓库和
git push
: 如果你的代码存储在远程仓库(如 GitHub、GitLab、Bitbucket 等),你可以使用git push
命令将你在本地仓库中的提交推送到远程仓库。这将会在远程仓库中创建与你的本地提交相对应的提交记录。 - 从远程仓库获取和
git fetch
、git pull
、git clone
: 当其他人在远程仓库中提交了更改,你可以使用git fetch
命令获取这些更改到你的本地仓库,但不会自动合并到你的分支中。使用git pull
命令可以获取远程更改并自动合并到当前分支。另外,使用git clone
命令可以从远程仓库复制整个项目到本地,包括分支、提交历史和文件。 - 切换分支和
git checkout
: 如果你想在本地工作目录中切换到不同的分支,你可以使用git checkout
命令。这会将你的工作目录中的文件更改为指定分支中的文件。你可以在不同的分支上进行开发和修改,每个分支可以有自己的更改和提交历史。
常用命令介绍
git config
配置 git 的设置,包括全局设置、仓库设置以及当前项目设置,全局设置会应用于当前用户的所有 git 仓库
#设置全局用户名
$ git config --global user.name 'xs'
#设置全局邮箱
$ git config --global user.email xs@163.com
#查看自己的全局设置
$ git config --global --list
#设置默认的文本编辑器为 VS Code,以便在需要输入提交信息或解决合并冲突时打开编辑器,你也可以将code替换为其他支持的编辑器命令,例如 vim、nano 等。
$ git config --global core.editor "code --wait"
#设置换行符处理为自动(core.autocrlf 设置为 true),
$ git config --global core.autocrlf true
#设置合并工具为默认的diffmerge,或者替换diffmerge为其他的合并工具vimdiff、meld、kdiff3等
$ git config --global merge.tool diffmerge
#通过设置这些选项,你可以定制 Git 的行为以适应你的开发环境和偏好
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-config
git -init
用于在目录中创建新的 Git 仓库
#在项目文件中,我们可以通过使用git init创建一个新的git仓库
$ git init
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-init
git-clone
克隆/拷贝一个远程git仓库到本地
#git clone会自动设置远程仓库的别名为origin,你可以使用其他Git命令与这个远程仓库进行交互,例如git pull 获取远程更改、git push 推送本地更改等
#url为你克隆仓库的地址
$ git clone <repository-url>
#将克隆的仓库保存到指定的文件夹名
$ git clone <repository-url> <directory-name>
#克隆仓库时仅获取指定数量的最新提交,减小克隆的历史记录大小
$ git clone --depth <depth> <repository-url>
#克隆特定分支的内容
$ git clone --branch <branch-name> <repository-url>
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-clone
git-add
将文件内容的修改添加到暂存区
#添加一个或者多个文件到暂存区
$ git add <file1> <file2> ...
#添加一个目录到暂存区
$ git add <dir>
#添加当前目录下的全部文件到暂存区
$ git add .
#添加所有更改,包括未跟踪的新文件和已删除的文件
$ git add -A
#只添加已修改或已删除的文件,不包括新文件
$ git add -u
#以交互模式添加部分更改。会显示每个更改,你可以选择要添加的部分更改
$ git add -p
#以交互式方式进行更改操作,允许你选择要添加的更改
$ git add -i
#表示强制添加某个文件,不管.gitignore是否包含了这个文件
$ git add -f <fileName>
#添加完我们可以使用status进行查看
$ git status -s
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-add
git-status
查看git仓库当前状态的命令
$ git status
#通过-s进行获取简短的结果信息,不指定-s 会输出分支名称、当前分支与远程分支的关系、是否最新、为添加进暂存区的修改的文件、为添加进版本控制的文件
$ git status -s
#显示被 .gitignore 文件忽略的文件
$ git status --ignored
#显示详细的状态信息,包括分支名称和追踪状态
$ git status -v
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-status
git-diff
比较暂存区的文件和修改后文件的差异
#显示暂存区和当前修改的文件差异
$ git diff <file>
#比较当前工作目录中的文件与指定提交之间的差异
$ git diff <commit-hash>
#比较暂存区中的文件与最后一次提交之间的差异
$ git diff --cached <file>
#显示这两次提交的文件差异
$ git diff <commit1> <commit2>
#显示简要的文件差异统计信息
$ git diff --stat
#比较两个分支之间的文件差异
$ git diff <branch1> <branch2>
#以单词为单位显示文件差异,更容易理解
$ git diff --color-words
#只显示发生变化的文件名,而不显示具体的差异内容
$ git diff --name-only
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-diff
git-commit
将暂存区内容添加到本地仓库中
#提交暂存区到本地仓库中(message为提交的信息)
$ git commit -m <message>
#提交暂存区指定文件到本地仓库中
$ git commit <file1> <file2> ... -m <message>
#简便提交,使用-a可以不需要进行git add 操作,从而直接提交文件到本地仓库中(推荐直接使用-a进行提交)
$ git commit -am <message>
#在提交消息中包含所做的更改的差异。这个选项可以帮助你在提交消息中快速查看更改的内容
$ git commit -v
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-commit
git-reset
用于移动分支引用、撤销提交或修改提交历史的命令,它允许你重置分支的位置、将分支的状态回退到之前的提交,或者修改提交历史
$ git reset <commit>
#<commit>:要将分支移动到的目标提交的哈希
#常见模式
--soft:#将分支移动到指定提交,但不会修改工作目录和暂存区。提交的更改将保留在暂存区,你可以重新提交它们。
--mixed(默认模式):#将分支移动到指定提交,并将暂存区重置为空。工作目录中的更改会被保留,但不会自动提交。
--hard:#将分支移动到指定提交,并重置暂存区和工作目录为提交的状态。这会清除未提交的更改。
#需要小心使用 git reset,特别是使用 --hard模式,因为它可以丢弃未提交的更改和历史提交。确保在使用之前备份重要的更改。
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-reset
git-rm
从暂存区和工作取中删除文件
$ git rm <file>
#如果文件以及修改了放入暂存区,我们需要加上-f进行强制删除
$ git rm -f <file>
#如果我们只想删除暂存区的文件,不删除本地的文件可以使用 --cached指定暂存区
$ git rm --cached <file>
#也可以使用*指定删除全部
$ git rm -f *
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-rm
git-mv
移动或者重命名一个文件、目录
$ git mv <file> <newfile>
#以上的newfile如果已经被创建了 可以使用-f进行强制生成
$ git mv -f <file> <newfile>
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-mv
git-log
查看提交历史记录的命令
#查看在仓库中进行的提交,包括提交的作者、时间戳、提交消息以及提交哈希等信息,可以帮助你了解项目的演变、审查更改以及跟踪代码的发展
$ git log
#仅显示最近 <number> 条提交记录
$ git log -n <number>
#以简洁的一行格式显示每个提交的哈希和提交消息
$ git log --oneline
#仅显示特定作者的提交记录
$ git log --author=<author>
#仅显示包含特定文本模式(<pattern>)的提交记录
$ git log --grep=<pattern>
#根据日期范围过滤提交记
$ git log --since=<date> 和 $ git log --until=<date>
#显示特定分支的提交历史记录
$ git log <branch-name>
#仅显示与指定文件或目录相关的提交记录
$ git log <path>
#以图形化的方式显示提交历史,显示分支和合并关系
$ git log --graph
#使用 q 键可以退出 git log 命令的查看模式,返回命令行界面
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-log
git-blame
显示文件的每一行的修订版本和作者最后修改的内容
#显示文件中每一行代码的详细信息,包括作者、提交哈希、提交时间以及对应的代码。这可以帮助你追踪特定代码行的来源和修改历史
$ git blame <file-name>
#仅显示文件中指定行范围内的代码作者和提交信息
$ git blame -L <start>,<end> <file-name>
#显示文件中每一行的作者和提交信息,并尝试检测代码的拷贝和移动操作。
$ git blame -C <file-name>
#在输出中包含每个作者的代码行数统计
$ git blame --show-stats <file-name>
#更进一步地检测代码的拷贝和移动操作,可以捕捉更多的历史信息。
$ git blame -C -C -C <file-name>
#检测代码的移动操作,与拷贝和重命名相关
$ git blame -M <file-name>
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-blame
git-remote
提供了一些用于查看、添加、重命名和删除远程仓库的功能
#列出当前仓库中已配置的远程仓库
$ git remote
#列出当前仓库中已配置的远程仓库,并显示它们的 URL
$ git remote -v
#添加一个新的远程仓库。指定一个远程仓库的名称和 URL,将其添加到当前本地仓库中
$ git remote add origin https://github.com/user/repo.git
#将本地配置的远程仓库重命名
$ git remote rename origin new-origin
#从当前仓库中删除指定的远程仓库
$ git remote remove new-origin
#修改本地指定远程仓库的 URL
$ git remote set-url origin https://github.com/user/new-repo.git
#显示指定远程仓库的详细信息,包括 URL 和跟踪分支
$ git remote show origin
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-remote
git-merge
用于从指定的commit(s)合并到当前分支的操作
$ git merge <branch-name> #要合并更改的源分支的名称
#简单使用 我们可以使用 git checkout master(分支名) 切换到master或者指定分支分支,然后使用git merge dev(需要从其他分支合并到当前分支的分支名)
#如果存在冲突,你需要手动编辑文件,解决冲突,并使用 git add 标记已解决的文件。然后使用 git commit 提交解决冲突后的更改
#合并前可以使用 git diff <target-branch>..<source-branch> 查看要合并的更改内容
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-merge
git-fetch
从指定的远程仓库获取最新更改
$ git fetch <remote-name>
#<remote-name> 远程仓库的名称,通常是 origin,表示默认远程仓库
#不指定<remote-name>默认为origin 仓库获取
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-fetch
git-pull
用于从远程仓库获取最新更改并将其合并到当前分支的命令。它实际上是 git fetch
和合并操作的组合,通常直接使用git pull就行了特色情况除外(多人协作时更难清晰地了解每个提交的来源,以及可能存在潜在的冲突和问题)
#git pull 会执行 git fetch,从远程仓库获取最新提交和信息,但并不会自动合并到你的分支。然后,git pull 会自动尝试将远程分支的更改合并到当前所在的本地分支。如果没有冲突,这个合并操作会自动进行。
$ git pull <remote-name> <branch-name>
#<remote-name>: 远程仓库的名称,通常是 origin
#<branch-name>: 要从远程仓库合并更改的分支名称
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-pull
git-push
将本地分支的更改推送到远程仓库的命令
#将你的代码提交推送到共享的远程仓库,以便与其他开发人员共享和协作。
$ git push <remote-name> <branch-name>
#<remote-name>: 远程仓库的名称,通常是 origin
#<branch-name>: 要推送的本地分支名称
#设置本地分支与远程分支的关联关系,使后续的 git push可以省略远程分支名称。例如:git push -u origin main,后续可以直接使用git push就可以直接推送到origin的main分支上
$ git push -u <remote-name> <branch-name>
#强制推送,用于覆盖远程分支上的提交。慎用,因为这可能会覆盖其他人的更改
$ git push -f <remote-name> <branch-name>
#推送所有分支,包括本地的所有分支到远程仓库
$ git push --all <remote-name> <branch-name>
#推送所有标签(tags)到远程仓库
$ git push --tags <remote-name> <branch-name>
#使用建议:
#推送前,通常建议先使用 git pull 获取最新的远程更改并合并到你的本地分支,以避免冲突。如果你不是远程仓库的拥有者或合作者,可能需要向仓库的拥有者提交合并请求(Pull Request)来将你的更改合并到远程仓库。
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-push
git-branch
用于列出、创建、删除和切换分支
#显示当前仓库中所有的分支列表,并在当前分支旁边标注一个星号(*)表示当前所在分支。
$ git branch
#创建一个新分支,名称为 <branch-name>
$ git branch <branch-name>
#删除指定分支,名称为 <branch-name>。这个操作会检查是否包含未合并的更改,如果有未合并的更改,分支不会被删除
$ git branch -d <branch-name>
#强制删除指定分支,不管它是否包含未合并的更改
$ git branch -D <branch-name>
#将当前分支重命名为 <new-branch-name>
$ git branch -m <new-branch-name>
#列出远程分支
$ git branch -r
#列出所有分支(本地和远程)
$ git branch -a
#只列出分支名,不显示其它信息
$ git branch -l
#用于复制分支,创建一个新分支,并在其上进行reset操作
$ git branch -c <old-branch> <new-branch>
#用于复制分支,创建一个新分支,但是不进行reset操作
$ git checkout -b <new-branch> <old-branch>
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-branch
git-checkout
用于切换分支、恢复文件、创建新分支以及进行一些其他操作的命令
#切换分支到指定分支 git2.23版本后可以使用git switch来代替git checkout 用于分支切换
$ git checkout <branch-name>
#创建并切换到新分支,包括了创建新分支以及切换到新分支
$ git checkout -b <new-branch-name>
#恢复文件,用于撤销对工作目录中指定文件(<file-name>)所做的更改,将其恢复到最近一次提交的状态
#git2.23版本后可用于git restore来代替git checkout -- 用于文件恢复
$ git checkout -- <file-name>
#切换到特定提交,用于查看特定提交(<commit-hash>)的状态,但会进入“分离头指针”状态,即不会位于任何分支上
$ git checkout <commit-hash>
#切换标签,用于切换到特定标签(<tag-name>)所对应的提交
$ git checkout <tag-name>
#切换到远程分支,用于从远程仓库的指定分支(<remote-branch-name>)创建并切换到一个新分支(<new-branch-name>),同时使新分支跟踪远程分支
$ git checkout -b <new-branch-name> <remote-name>/<remote-branch-name>
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-checkout
git restore
用于文件的还原,将更改的文件从暂存区或最近的提交中恢复到工作目录( git 2.23 版本引入的新命令)
#例如如果你修改了某个文件,并希望将它从暂存区或最近的提交中恢复到工作目录,你就可以尝试使用这个
$ git restore <file-name>
#如果 <file-name>在暂存区中有更改,git restore将会将这些更改还原到工作目录中,保留工作目录中的更改
#如果 <file-name>在暂存区中没有更改,但在最近的提交中有更改,git restore将会将这些更改还原到工作目录中
git-switch
用于切换分支的命令。它可以让你在不同的分支之间进行切换,以便开始在不同的分支上进行工作( git 2.23 版本引入的新命令)
$ git switch <branch-name>
#<branch-name>:要切换到的目标分支的名称
#如果你的工作目录和暂存区是干净的(没有未提交的更改),那么 git switch 将直接切换到指定的分支
#如果你有未提交的更改,git switch将拒绝切换,除非你将这些更改提交或保存到临时存储区(stash)
git-tag
用于管理git标签,标签是用于标识特定提交状态的快照,通常在项目达到重要的里程碑或版本时使用。标签不像分支,它们是静态的,不会随着新的提交而移动
#查看标签
$ git tag
#在当前提交上创建一个轻量级标签,这只是一个指向提交的引用
$ git tag <tag-name>
#<tag-name>:要创建的标签的名称,例如V1.0
$ git tag -a <tag-name> -m <message>
#<message>:给标签添加的注释信息,方便解读
#为过去的某个提交创建标签
$ git tag -a <tag-name> <commit-hash>
#<commit-hash>:是过去提交的版本哈希
#需要注意的是,标签默认只存在于你的本地仓库中,如果想要将标签推送到远程仓库,你需要显式地将它们推送
$ git push origin <tag-name>
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-tag
git-mergetool
解决合并冲突的命令。当在合并分支时发生冲突时,Git 会尝试自动合并更改,但有时需要人工干预以解决冲突。git mergetool
可以调用外部合并工具来帮助你更轻松地解决冲突。
$ git mergetool
#运行这个命令将打开你配置的合并工具,并且会根据冲突提示你解决冲突。常见的外部合并工具包括:
vimdiff:这是 Vim 编辑器的合并工具,会以分屏的方式显示冲突内容,允许你手动编辑和解决冲突
diffmerge:一个图形化的合并工具,提供了比较和解决冲突的图形界面
meld:另一个图形化的合并工具,也提供了图形界面来比较和解决冲突
kdiff3:跨平台的图形化合并工具,适用于 Windows、macOS 和 Linux
p4merge:由 Perforce 提供的图形化合并工具,也适用于 Git
opendiff:macOS 自带的合并工具,用于比较和解决冲突
code:Visual Studio Code 编辑器,可以通过 code --wait 命令以编辑器模式打开
emacs:Emacs 编辑器,可以用于解决冲突
#在使用 git mergetool 之前,你需要确保已经配置了合适的合并工具。你可以使用类似以下的命令来配置合并工具
$ git config --global merge.tool vimdiff
#然后,当你运行 git mergetool时,Git将调用指定的合并工具来帮助你解决冲突
#需要注意的是,不同的合并工具有不同的界面和操作方式,所以你需要熟悉你所选择的工具的使用方法。
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-mergetool
git-stash
用于临时保存未提交的更改的命令。当你在进行开发时,可能需要在切换分支或合并操作之前暂时保存未提交的更改,以便在后续恢复工作状态。使用 git stash
可以将这些更改保存在一个临时区域,允许你在需要时重新应用这些更改
#运行这个命令将会将当前分支的未提交更改保存在一个临时的存储区(stash)中。这将撤销工作目录中的更改,使工作目录保持干净状态
$ git stash
#你还可以为每个存储的状态添加描述,以便更好地区分不同的存储
$ git stash save <message>
#要恢复之前保存的状态,可以使用
$ git stash apply
#如果你保存了多个 stash,你可以使用索引来应用特定的 stash
$ git stash apply stash@{index}
#列出所有保存的 stash
$ git stash list
#恢复最新的 stash,并从 stash 列表中删除它
$ git stash pop
#删除最新的 stash
$ git stash drop
#清空所有的 stash
$ git stash clear
#详情可以参考官方文档的介绍:https://git-scm.com/docs/git-stash