65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows用户 Git 命令行基础参考

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (20投票s)

2012年9月12日

CPOL

13分钟阅读

viewsIcon

456883

CodeProject虽然有可用的 Git GUI 界面(有些好,有些坏),但熟悉至少 Git 命令行界面的基础知识,可以极大地增强你充分利用该工具的能力。

git虽然有可用的 Git GUI 界面(有些好,有些坏),但熟悉至少 Git 命令行界面的基础知识,可以极大地增强你充分利用该工具的能力。由于我相对来说是 Git 和版本控制方面的新手,我着手学习 Git 命令行的基础知识。在此过程中,我发现随身携带常用命令列表非常方便,这样我就不必反复搜索。

在这篇文章中,我将介绍使用 Git 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 命令行。此外,这里列出的大多数命令都有比我包含的更多的选项。我试图保持简单,作为我自己的参考,以及任何可能觉得对入门有用的其他人。

额外资源


© . All rights reserved.