Windows用户 Git 命令行基础参考
CodeProject虽然有可用的 Git GUI 界面(有些好,有些坏),但熟悉至少 Git 命令行界面的基础知识,可以极大地增强你充分利用该工具的能力。
 虽然有可用的 Git GUI 界面(有些好,有些坏),但熟悉至少 Git 命令行界面的基础知识,可以极大地增强你充分利用该工具的能力。由于我相对来说是 Git 和版本控制方面的新手,我着手学习 Git 命令行的基础知识。在此过程中,我发现随身携带常用命令列表非常方便,这样我就不必反复搜索。
虽然有可用的 Git GUI 界面(有些好,有些坏),但熟悉至少 Git 命令行界面的基础知识,可以极大地增强你充分利用该工具的能力。由于我相对来说是 Git 和版本控制方面的新手,我着手学习 Git 命令行的基础知识。在此过程中,我发现随身携带常用命令列表非常方便,这样我就不必反复搜索。
在这篇文章中,我将介绍使用 Git Bash 命令行界面有效导航和维护源代码仓库所需的最基本命令集。也许,在创建这篇文章时,我将不需要再查阅它了,因为仅仅是撰写和解释这个列表的事实,就会将这些内容永远地刻入我的大脑。另一方面,如果我将来有任何不确定的地方,我将有一个地方可以查阅!
注意:此处的参考绝非详尽无遗。我包含了开始所需的基础命令,以及每个命令的常用选项。互联网上有大量额外的可用信息,我在文章末尾也包含了一些有用的参考链接。
为了更方便地找到您可能需要的信息,以下是一些指向本文特定部分的链接:
与文件系统一起工作
- 使用 Bash 命令行导航文件系统
- 使用 Bash 命令行显示目录内容
- 使用 Bash 命令行创建新目录
- 使用 Bash 命令行创建文件
- 使用 Bash 命令行删除文件
- 使用 Bash 命令行删除目录
配置 Git 和创建存储库
暂存和提交更改
与远程存储库(如 Github)一起工作
撤销更改并处理标签
Git Bash:语法说明
目录路径
首先,请注意 Git Bash 是一个 *nix 应用程序(Unix/Linux),并且在文件系统导航方面期望遵循 *nix 约定。这在使用 Windows 系统上的 Git 时非常重要,因为我们需要在心理上将熟悉的 Windows 目录表示法映射到 Unix 格式。
| Windows 目录路径 | —————— 变为 —————— | *nix 目录路径 | 
| C:\Users\MyUserFolder\ | /c/Users/MyUserFolder/ | 
带空格的字符串
当我们输入没有空格的字符串时,无需做任何操作。但是,包含空格的字符串必须用引号括起来。请记住这一点。个人而言,我只是将引号用于所有字符串。
“主”目录
*nix 系统中的文件系统设置与 Windows 略有不同。Git Bash 假定每个用户都存在一个“主”目录。在 Windows 中,默认是您的个人用户文件夹。Git Bash 默认在此文件夹中打开。在命令提示符后仅输入 cd 将始终将您带回到主目录的根级别。
命令语法格式
Git Bash 命令的基本命令语法为:$ CommandName [options] [directory]
在上面,方括号表示命令的可选部分。方括号本身不会键入到命令行中。跟随命令但未包含在括号中的项是必需的。
区分大小写和空格
另请注意,Git Bash 区分大小写,并且空格也算。例如,切换到另一个目录的常用命令是 cd。这与 CD 或 Cd 不同。
可选输入
当命令的某些部分是可选的时,我们会通过将其括在方括号中来注明。$ Command [options]
在上面,我们不键入方括号。
用户输入
在本指南中,当我们提供命令语法示例时,我们将使用尖括号来表示用户提供的值。$ Command [options] <SomeUserInput>
在上面,我们既不键入方括号也不键入尖括号。
Git Bash:导航文件系统 (cd)
语法
cd [选项] [<目录>]
导航到主目录(当前用户的默认文件夹)
$ cd
导航到文件系统中的特定文件夹
$ cd /c/SomeFolder/SomeOtherFolder/
导航到文件系统中的特定文件夹(如果目录路径中有空格)
$ cd “/c/Some Folder/Some Other Folder/”
返回到上一个位置
$ cd -
向上移动一个目录级别
$ cd ..
在上面,cd 命令后面跟着一个空格,然后是两个点,中间没有空格。
Git Bash:显示目录内容 (ls)
语法
ls [选项]
选项
-1 = 每行列出 1 个项目
-r = 反转排序顺序
-a = 显示所有内容,包括隐藏项
-d = 仅列出目录
-l = (小写字母 L)= 使用长列表格式(每个项目更多信息,按列排列,垂直列表)
列出当前目录(文件夹)的内容:
$ ls
上面的命令将当前目录的内容显示为水平列表。不太方便。
列出当前目录的内容,每行一个项目
$ ls -1
这样好多了。但请注意,我们只能根据文件扩展名来区分文件和子目录。
仅列出当前目录中的子目录(文件夹)
$ ls –d */
以长格式垂直列出所有内容
$ ls –al
上面的命令提供了大量信息。另外,子目录可以通过第一列(以 drwxr 开头而不是 -rw)区分。
列出所有内容,包括子目录内容,每行一个项目:
$ ls -1 *
Git Bash:创建新目录 (mkdir)
语法
mkdir [选项] <文件夹名>
选项
-p = 根据需要创建父目录
--verbose = 为每个新创建的目录显示一条消息(注意双破折号)
在当前目录中创建一个文件夹(文件夹名不带空格):
$ mkdir NewFolderName
在当前目录中创建一个文件夹(文件夹名带空格)
$ mkdir “New Folder Name”
在指定的目录路径中创建一个文件夹:
$ mkdir /c/ExistingParentFolder/NewFolderName
在指定的目录路径中创建一个文件夹,并根据需要创建父目录:
$ mkdir -p /c/NewParentFolder/NewFolderName
在指定的目录路径中创建一个文件夹,根据需要创建父目录,并在控制台窗口中打印所执行操作的描述:
$ mkdir -p --verbose /c/NewParentFolder/NewFolderName
Git Bash:创建文件 (touch, echo)
语法
touch [选项] <文件名>
echo [选项] 字符串 > 文件名
(注意:文件名可以包含目录。默认是当前目录)。
在当前目录中创建一个(空)文本文件
$ touch newFile.txt
在指定目录中创建一个(空)文本文件:
$ touch /c/SomeFolder/newFile.txt
在当前目录中创建多个(空)文本文件:
$ touch newFile_1.txt newFile_2 . . . newFile_n
将文本追加到文件。如果文件不存在,则创建一个:
$ echo “This text is added to the end of the file” >> newFile.txt
覆盖文件中的文本。如果文件不存在,则创建一个
$ echo “This text replaces existing text in the file” > newFile.txt
覆盖指定位置的文件中的文本。如果文件不存在,则创建一个:
$ echo “This text replaces existing text in the file” > /c/SomeFolder/newFile.txt
Git Bash:删除文件 (rm)
语法
rm [选项] <文件名>
选项
-I (或 --interactive)= 删除前提示
-v (或 --verbose)= 解释正在执行的操作
从当前目录中删除指定的文件(无空格):
$ rm DeleteFileName
从当前目录中删除指定的文件(带空格):
$ rm “Delete File Name”
在删除当前目录中的指定文件之前提示确认(无空格)
$ rm -i DeleteFileName
删除指定的文件并在控制台窗口中报告所执行的操作:
$ rm -v DeleteFileName
Git Bash:删除目录 (rmdir, rm -rf)
语法:
rmdir [选项] <文件夹名>
rm -rf
删除指定的空文件夹。如果文件夹不为空,操作将失败:
$ rmdir DeleteFolderName
删除指定的文件夹及其所有内容
$ rm -rf DeleteFolderName
Git Bash:配置 Git (git config)
语法
git config --global user.name <“用户名”>
git config --global user.email <用户邮箱地址>
设置系统中当前用户的全局 User.Name 值:
$ git config --global user.name “FirstName LastName”
设置系统中当前用户的全局 User.Email 值:
$ git config --global user.email UserEmailAddress
显示当前值
以下命令分别返回 user.name 和 user.email 属性的当前值,并将值输出到控制台窗口:
将当前的全局 User.Name 值打印到控制台窗口:
$ git config --global user.name
将当前的全局 User.Email 值打印到控制台窗口
$ git config --global user.email
Git Bash:初始化新 Git 存储库 (git init)
语法
git init
创建当前目录中执行版本控制所需的文件:
$ git init
Git Bash:添加/暂存以供提交 (git add)
语法
git add [选项] [<文件_1>] [<文件_2>] . . . [<文件_n>]
选项
-A (或 --all)= 将所有新文件或已更改文件添加到暂存更改中,包括已删除项(删除)
-u = 将已跟踪文件的更改和删除添加到下一次提交。不添加新文件。
. = 将新文件或已更改文件添加到下一次提交的暂存更改中,但不添加删除。
注意,git add -A 在语义上等同于 git add . 后跟 git add –u。
-p = 交互式添加。逐步处理工作目录中的更改并提示是否添加
将工作目录中的所有更改添加到下一次提交,包括新文件和删除:
$ git add -A
将所有更改添加到已跟踪文件和所有新文件中以供下次提交,但不添加文件删除:
$ git add .
将所有已跟踪文件的更改和所有文件删除添加到下一次提交,但不添加新文件
$ git add -u
逐步处理更改的文件并提示用户添加选项。不包括新文件:
$ git add -p
Git Bash:取消暂存以供提交 (git reset)
语法
git reset HEAD <文件_1>
从下一次提交中移除指定的文件:
$ git reset HEAD FileName
Git Bash:提交更改 (git commit)
语法
git commit [选项] [<文件_1>] [<文件_2>] . . . [<文件_n>] [-m <“提交消息”>]
选项
-a = 提交自上次提交以来所有已跟踪文件的更改
-v = 详细:在提交消息屏幕中包含已提交项目的差异
--amend = 编辑与最近一次提交关联的提交消息
--amend <文件_1> <文件_2> . . . <文件_n> = 重做上一次提交并包含指定文件的更改。
提交指定文件(们)的更改,并包含指定的提交消息:
$ git commit FileName –m “Message Text”
请注意,Git 要求 提供提交消息。如果您不使用 -m 选项提供,将在执行提交之前提示您。
提交自上次提交以来所有已更改的文件。不包括新文件。
$ git commit –a –m “Message Text”
将所有更改添加到上一次提交,并用新的消息文本覆盖提交消息。不包括新文件:
$ git commit –a –amend –m “Message Text”
Git Bash:远程存储库 (git remote)
语法
git remote add <远程名称> <远程 URL>
git remote show <远程名称>
注意:此处使用的 RemoteName 代表您的远程存储库的本地别名(或昵称)。服务器上远程存储库的名称不一定与您的本地别名相同。
将指定的远程存储库添加到您的 git config 文件。然后可以向该远程存储库推送/从中拉取:
$ git remote add RemoteName https://RemoteName/Proj.git
将指定远程存储库的信息打印到控制台窗口:
$ git remote show RemoteName
Git Bash:分支 (git branch)
语法
git branch [选项][<分支名>][<起始点>]
选项
-a = 列出所有本地和远程分支
-r = 列出所有远程分支
列出所有本地分支
$ git branch
列出所有远程分支
$ git branch -r
列出所有本地和远程分支:
$ git branch -a
创建一个新分支,从当前分支的历史记录的某个点开始
$ git branch BranchName
请注意,这会创建新分支,但不会“检出”(使其成为当前工作分支)。
从当前分支切换到指定分支:
$ git checkout BranchName
创建新分支并从当前分支切换到它:
$ git checkout –b NewBranchName StartPoint
请注意,StartPoint 指的是一个修订号(或其前六个字符)或一个合适的标签。
Git Bash:合并分支
语法
git merge [<分支名>][--no-commit]
将指定分支合并到当前分支,并自动提交结果:
$ git merge BranchName
将指定分支合并到当前分支,但不提交结果:
$ git merge BranchName --no-commit
Git Bash:推送到远程存储库 (git push)
语法
git push [<远程名称> <分支名称>]
使用本地系统和服务器之间所有现有分支的提交更新远程服务器。本地系统中从未推送到服务器的分支不会共享。
$ git push
使用指定分支的提交更新远程服务器。如果新分支在服务器上不存在,则必须使用此命令将新分支从本地存储库推送到服务器。
$ git push RemoteName BranchName
Git Bash:从远程存储库获取 (git fetch)
语法
git fetch <远程名称>
从服务器检索本地尚不存在的任何提交:
$ git fetch RemoteName
注意:git fetch 会从远程检索信息并将其本地记录为当前存储库中的一个分支。为了将新更改合并到本地分支,您需要运行 git fetch,然后是 git merge。由于远程存储库可能有一个以上的分支,因此必须指定您希望合并到当前分支的分支。
合并获取后的合并语法
git merge <远程名称/分支名称>
将从远程新获取的分支合并到当前工作分支:
$ git merge RemoteName/BranchName
在合并之前使用 fetch 允许您从远程拉取变更集,但可以先检查它们并/或解决冲突,然后再尝试合并。
Git Bash:从远程存储库拉取 (git pull)
语法
git pull <远程名称/分支名称>
从远程指定的提交中获取更改,并将它们合并到当前本地分支:
$ git pull RemoteName/BranchName
注意:git pull 本质上与先运行 git fetch 然后运行 git merge 相同。
Git Bash:撤销 (git reset)
语法
git reset [选项]
选项
--hard = 撤销自上次提交以来的所有操作
--hard ORIG_HEAD = 撤销最近一次合并以及之后的所有更改。
--soft HEAD^ = 撤销最后一次提交,保留暂存的更改
撤销自上次提交以来的所有操作:
$ git reset --hard
撤销最近一次成功的合并以及之后的所有更改:
$ git reset --hard ORIG_HEAD
撤销最近一次提交,但保留暂存区中的更改:
$ git reset --soft HEAD^
Git Bash:标签 (git tag)
语法
git tag [选项] [<标签名>] [<提交校验和>] [<标签消息?>]
选项
-a = 附注标签
-m = 附注标签消息
列出当前存储库中的所有标签:
$ git tag
在当前修订处创建标签:
$ git tag TagName
在由部分校验和(通常六个字符就足够了)指定的提交处创建标签
$ git tag TagName CommitChecksum
创建一个附注标签:
$ git tag -a TagName -m TagMessage
在由部分校验和指定的提交处创建一个附注标签:
$ git tag -a TagName CommitChecksum
将标签推送到远程存储库:
$ git push --tags
将特定标签的信息打印到控制台窗口:
$ git show TagName
以上几乎所有的信息都代表了一个“浅尝辄止”的采样,目的是让您开始。除了 Git 本身内部,还有更多命令可供使用,以及更通用的 Bash 命令行。此外,这里列出的大多数命令都有比我包含的更多的选项。我试图保持简单,作为我自己的参考,以及任何可能觉得对入门有用的其他人。
额外资源
- Linux Bash 命令行 A-Z 索引
- Git 参考
- Scott Chacon 的 Pro Git 书籍(电子书)
- Pro Git (软件开发专家之声)
- Git 备忘单
- Github
- Github 帮助



