Windows用户 Git 命令行基础参考
CodeProject虽然有可用的 Git GUI 界面(有些好,有些坏),但熟悉至少 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 帮助