一、 如何使用Git?
要在Git中建立一个空目录并从远程服务器同步一个或多个项目的内容到本地,这里将涵盖如何初始化一个新的Git仓库,克隆远程仓库,并在本地进行修改而不需要联网。
1.1 Git安装步骤指南
1. 安装Git
在Ubuntu上安装Git的过程相对简单,您可以通过命令行工具来完成。
(1)更新软件包信息
在安装任何软件之前,建议首先更新软件包信息,以确保您将安装最新版本的Git。打开终端,并运行以下命令:
sudo apt-get update
(2)** 安装Git**
以通过以下命令安装Git:
sudo apt-get install git
(3)验证安装
安装完成后,您可以通过以下命令来验证Git是否成功安装,并查看其版本号:
git --version
如果安装成功,您将看到类似于以下的输出:
git version 2.x.x
其中2.x.x
表示您安装的Git版本号。
(4). (可选)配置Git
在使用Git之前,您可能需要进行一些基本配置,例如设置您的用户名和电子邮件地址。这将用于提交记录。运行以下命令:
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
替换Your Name
和your.email@example.com
为您的实际姓名和电子邮件地址。
2. 初次运行Git之前配置
在初次运行Git之前,进行合适的配置是非常重要的。这可以帮助您个性化Git的行为,并确保您的提交记录包含正确的信息。Git的配置可以分为三个不同的层级:
系统级配置 (/etc/gitconfig
)
用户级配置 (~/.gitconfig
)
仓库级配置 (.git/config
)
关于如何在每个级别进行配置的详细信息,以及如何使用git config
命令进行这些配置。
(1)系统级配置
系统级配置适用于系统中的所有用户。这些配置文件位于/etc/gitconfig
。可以使用下面的命令设置系统级配置:
sudo git config --system <key> <value>
例如,设置默认文本编辑器为nano
的命令为:
sudo git config --system core.editor nano
(2)用户级配置
用户级配置适用于当前用户,配置文件位于用户主目录下的~/.gitconfig
。可以使用以下命令进行用户级配置:
git config --global <key> <value>
常见的用户级配置包括设置用户名和电子邮件(这些信息将记录在每次提交中):
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
(3)仓库级配置
仓库级配置仅适用于当前Git仓库。配置文件位于当前项目目录的.git/config
中。可以使用以下命令进行仓库级配置:
git config --local <key> <value>
例如,设置当前仓库的远程库地址:
git config --local remote.origin.url https://github.com/username/repo.git
(4)查看配置
可以查看当前的Git配置,并指定级别:
-
查看系统级配置:
git config --system --list
-
查看用户级配置:
git config --global --list
-
查看仓库级配置:
git config --local --list
(5)配置覆盖
Git的配置遵循层级覆盖原则:如果在系统级和用户级都为同一个配置设置了不同的值,则用户级配置将覆盖系统级配置;如果在仓库级设置了配置,则仓库级配置将覆盖用户级和系统级配置。
(6)纠正命令格式
在您提供的命令中,有一些小的格式错误。以下是纠正后的完整命令列表:
git config --global user.name "huajie"
git config --global user.email "huajie@thunderst.com"
git config --global core.editor vi
git config --global merge.tool vimdiff
git config --global commit.template ~/.gitmsg.template
(7)常用的配置项
以下是一些常用的Git配置项,可以根据需要进行设置:
-
颜色输出:
git config --global color.ui auto
-
合并工具:
git config --global merge.tool meld
-
别名:
您可以为常用的Git命令创建别名,例如:
git config --global alias.co checkout git config --global alias.br branch
-
配置差异分析工具
设置Git合并时使用的差异分析工具,这里我们将其设置为
vimdiff
。配置命令为:git config --global merge.tool vimdiff
-
设置提交模板
如果希望在每次提交时使用一个预设的提交消息模板,可以配置提交模板文件。确保
~/.gitmsg.template
文件存在并包含您的模板内容:git config --global commit.template ~/.gitmsg.template
3. 创建一个空目录
在你的计算机上创建一个新的空目录。打开终端并执行以下命令(替换your-directory
为你希望创建的目录名):
mkdir your-directory
cd your-directory
4. 从远程服务器克隆项目
使用git clone
命令从远程服务器克隆一个项目。请使用以下格式:
git clone <remote-repository-url>
例如,如果远程仓库的URL是https://github.com/username/repo.git
,可以运行:
git clone https://github.com/username/repo.git
克隆完成后,你会在当前目录下看到一个名为repo
的文件夹,里面包含了项目的全部内容和版本历史信息。
5. 进入项目目录
进入克隆下来的项目目录:
cd repo
现在你有了本地项目的完整副本,可以在没有网络连接的情况下进行变化和提交。
6. 查看变化
在本地进行一些修改后,可以使用git status
命令查看文件的状态:
git status
这将显示哪些文件已修改、哪些文件处于跟踪状态以及哪些文件没有被跟踪。
7. 提交更改
如果你进行了更改并希望提交这些更改,可以按照以下步骤进行:
(1)添加文件到暂存区:
git add .
或者你可以逐个指定文件:
git add <filename>
(2)提交更改:
git commit -m "Your commit message here"
这条命令将你的修改记录到版本历史中。
8. 查看历史记录
你可以使用以下命令查看提交历史:
git log
这将显示所有提交的历史记录。
9. 推送更改(需要联网)
当你恢复联网后,可以将本地的更改推送到远程仓库:
git push origin main
请根据你的分支名称替换main
。
通过上述步骤,你可以在本地建立一个空目录并从远程服务器同步项目,同时在没有网络的情况下查看变化并做出提交。Git的设计使其能够在本地进行版本控制,适合离线工作。确保在恢复联网后将更改推送到远程仓库以保持同步。
1.2 Git命令的使用
Git 确实是一个强大的命令行工具,使用它进行版本控制的基本命令构成主要如下:
1. Git 命令的基本结构
一个典型的 Git 命令使用以下结构:
git <子命令> [选项] [参数]
2. 常用的 Git 子命令
(1) git init
:
- 用于初始化一个新的 Git 仓库。
- 示例:
git init
(2) git add
:
git add
是 Git 中一个非常重要的命令,主要用于将文件的更改添加到暂存区。下面详细介绍 git add
的三种主要用途以及如何忽略某些文件。
git add
的三种主要用途
开始跟踪新文件:
- 当您在 Git 仓库中创建一个新文件时,Git 默认不会跟踪这个文件。您需要使用
git add
命令来开始跟踪它。 - 示例:
git add newfile.txt
将已跟踪的文件放入暂存区:
- 当您对已跟踪的文件进行了修改,并希望在下次提交时包含这些更改,可以使用
git add
将这些更改放入暂存区。 - 示例:
git add modifiedfile.txt
- 如果您希望将所有已更改的文件都添加到暂存区,可以使用:
git add .
- 这个命令会将当前目录下的所有更改(包括新文件和修改过的文件)添加到暂存区。
标记合并冲突的文件为已解决状态:
- 在合并分支时,如果存在文件冲突,Git 会标记冲突的文件。解决冲突后,您需要使用
git add
来标记这些文件已被解决。 - 示例:
git add conflictedfile.txt
忽略某些文件
在 Git 中,您可以使用 .gitignore
文件来指定哪些文件和目录应该被 Git 忽略。这意味着这些文件不会被 Git 跟踪或纳入版本控制。
创建 .gitignore
文件
在您的 Git 仓库根目录下创建一个名为 .gitignore
的文件。
在 .gitignore
文件中,您可以列出需要忽略的文件或文件模式。例如,如果您希望忽略所有以 .o
或 .a
结尾的文件,可以在 .gitignore
中添加以下内容:
*.[oa]
示例 .gitignore
文件
# 忽略所有对象文件和库文件
*.[oa]
# 忽略日志文件
*.log
# 忽略临时文件
*.tmp
# 忽略特定目录
temp/
注意事项
.gitignore
文件仅在新文件或未跟踪文件上生效。如果某个文件已经被 Git 跟踪,您需要先将其从 Git 历史中删除(比如使用git rm --cached <file>
),然后才能有效地使用.gitignore
。- 您可以在项目的根目录下或其子目录下创建多个
.gitignore
文件,Git 会逐级应用这些规则。
通过以上信息,您可以更灵活地使用 git add
命令来管理文件,并有效地使用 .gitignore
来保持您的版本库整洁。
- 用于将文件的更改添加到暂存区,以便在下次提交时包含这些更改。
- 示例:
git add <file_name>
- 要添加所有更改的文件,可以使用:
git add .
(3)git status
:
- 用于查看当前工作目录和暂存区的状态,包括未跟踪的文件、未提交的更改等。
- 示例:
git status
(4) git commit
:
git commit
是 Git 中一个非常重要的命令,用于将暂存区中的更改提交到版本历史中。使用适当的提交信息可以帮助团队成员理解每次提交的目的和内容。
-
用于将暂存区的更改提交到本地仓库。
-
功能:将暂存区中的更改保存到版本历史中。每次提交都会生成一个唯一的提交 ID,用于标识该提交。
-
基本用法:
git commit -m "提交信息"
-
示例:
git commit -m "修复了登录页面的错误,优化了用户体验"
-
提交信息规范:良好的提交信息应包含以下几个要素:
- 简洁的描述:第一行通常是简短的描述(50 个字符以内),说明做了什么。
- 详细说明(可选):在第一行之后留一行空行,然后可以添加更详细的描述,包括为什么做出这些更改、解决了什么问题、影响的文件等。
git commit --amend
:
-
功能:修改最后一次提交。这对于修正提交信息或添加遗漏的文件非常有用。
-
用法:
git commit --amend -m "新的提交信息"
-
示例:
假设您提交后忽略了一些文件,可以将其添加到暂存区,然后运行:git add missing-file.txt git commit --amend -m "修复了登录页面的错误,添加了遗漏的文件"
这将更新最后一次提交,将
missing-file.txt
加入到该提交中,并用新的提交信息替换原来的信息。 -
注意事项:
- 使用
--amend
修改提交历史会改变提交 ID,因此在公共分支上使用时,请谨慎操作。如果其他人已经基于该提交进行了工作,修改历史可能会导致冲突。 - 如果不指定新的提交信息,
--amend
将打开默认的文本编辑器,您可以在其中编辑提交信息。
- 使用
(5) git help
:
- 用于查看 Git 命令的帮助文档。
- 示例:
git help <子命令>
- 例如,要查看
git commit
的帮助信息,可以使用:git help commit
(6) git clone:
- 用途:用于从远程 Git 仓库克隆一个完整的项目,包括所有的文件、提交历史和分支信息。
- 基本用法:
示例:git clone <repository_url>
git clone https://github.com/username/repo.git
- 效果:执行此命令后,会在当前目录下创建一个与远程仓库相同名称的目录,该目录包含所有的仓库内容。
(7) git pull:
-
用途:用于从远程仓库获取最新的更改,并将其合并到当前分支上。
git pull
本质上是git fetch
和git merge
的组合。 -
基本用法:
git pull <username>@<ipaddr>:<远端repository名> <远端分支名>:<本地分支名>
- 参数说明:
<username>
:远程仓库的用户名。<ipaddr>
:远程服务器的 IP 地址或域名。<远端repository名>
:远程仓库的名称。<远端分支名>
:您希望拉取的远程分支名称。<本地分支名>
:您希望将内容拉入的本地分支名称。如果不指定,本地分支将默认为当前分支。
示例:
git pull username@192.168.1.1:repo.git master:local_branch
- 参数说明:
特点与注意事项:
合并功能:
git pull
也可以用来合并分支。如果您在本地分支上已经有一些更改,执行git pull
将会尝试将远程分支的更改合并到本地分支中。- 如果存在冲突,Git 会提示您解决这些冲突。
与 git merge
的区别:
git pull
是一个更高层的操作,它自动从远程仓库下载更改并合并到当前分支。git merge
则是用于将两个分支的更改合并,而不涉及与远程仓库的交互。
git pull与git clone的区别
git clone
适用于首次获取远程仓库的内容,而git pull
用于更新已存在的本地仓库,以获取远程更新的内容。- 使用
git pull
时,需要注意合并的冲突问题,确保代码的整合顺利进行。
(8) git branch:
git branch
命令是 Git 中用于管理分支的工具。它可以帮助您创建、删除分支,并列出当前仓库中的所有分支。
查看分支:
-
列出所有分支:要查看当前 Git 仓库中的所有分支,执行以下命令:
git branch
-
输出示例:
* master test
输出中,带有
*
的分支是当前所处的分支,这里是master
分支。
创建分支
- 创建新分支:要创建一个新的分支,可以使用以下命令:
例如:git branch <branch-name>
git branch feature-1
删除分支
- 删除分支:要删除一个分支,可以使用
-d
或-D
选项。-
-d
:安全删除分支,只有在该分支的更改已被合并到其他分支时才能删除。如果该分支尚未合并,将会提示错误。git branch -d <branch-name>
示例:
git branch -d test
-
-D
:强制删除分支,不管该分支的更改是否已被合并。如果您确定要删除,可以使用此选项。git branch -D <branch-name>
示例:
git branch -D feature-1
-
其他常用选项
-
查看所有分支(包括远程分支):
git branch -a
-
查看详细信息:显示每个分支的最后一次提交信息:
git branch -v
使用建议
-
git branch
:列出当前仓库中的所有本地分支。 -
git branch <branch-name>
:创建一个新的分支。 -
git branch -d <branch-name>
:安全删除分支。 -
git branch -D <branch-name>
:强制删除分支。 -
在使用
git branch
创建新分支时,确保您已经在合适的分支上,并且根据功能或任务的类型命名分支,以便于管理和维护。 -
在删除分支之前,确保您不再需要该分支的更改,或者已经将更改合并到主分支或其他分支中,以免丢失重要的代码。
(9)git rm
:
git rm
是一个用于从 Git 仓库移除文件的命令,它不仅可以将指定文件从暂存区域移除,还可以将其从工作目录中删除。
基本用法:
- 要从暂存区和工作目录中删除指定文件,可以使用:
git rm <file_name>
- 示例:
git rm oldfile.txt
- 这将删除
oldfile.txt
文件,并将其更改记录在当前分支的下次提交中。
强制删除:
- 如果您尝试删除一个已经在暂存区中修改过的文件,Git 会要求您先处理这些更改。如果您确定要删除该文件并忽略这些更改,可以使用
-f
(force)选项强制删除:git rm -f <file_name>
- 示例:
git rm -f modifiedfile.txt
- 使用
-f
选项时,您将不会收到关于未提交更改的警告,文件将直接从暂存区和工作目录中删除。
仅从暂存区移除文件:
- 如果您只想将文件从暂存区移除,但保留工作目录中的文件,可以使用
--cached
选项:git rm --cached <file_name>
- 示例:
git rm --cached ignoredfile.txt
- 这条命令将从 Git 的版本控制中移除
ignoredfile.txt
,但文件仍然保留在您的工作目录中。
提交更改:在使用 git rm
删除文件后,您需要执行 git commit
将这些更改提交到版本历史中。
安全删除:在删除文件之前,请确保您不再需要这些文件,因为一旦删除并提交后,恢复这些文件可能会比较麻烦。
与 .gitignore
结合使用:如果您希望忽略某些文件并不让它们出现在版本控制中,务必在删除文件之前在 .gitignore
文件中进行声明。
git rm
是一个强大的命令,允许用户灵活地管理文件的删除。根据需要选择合适的选项,可以确保您的版本控制流程顺畅而有效。在删除文件时,始终要注意确认这些文件的内容和重要性,以防止不必要的数据丢失。
(10)git mv:
git mv
是一个用于重命名或移动文件的 Git 命令。通过这个命令,您可以轻松改变文件的名称或位置,并确保这些更改已被 Git 跟踪
重命名文件:
- 使用
git mv
可以重命名文件。例如,将README.txt
重命名为README
:git mv README.txt README
- 这条命令相当于执行以下操作:
mv README.txt README git rm README.txt git add README
- Git 将自动识别这是一个文件重命名操作,而不会将其视为删除和添加新文件。
移动文件:
- 您还可以使用
git mv
将文件移动到不同的目录。例如,将README.txt
移动到docs
文件夹:git mv README.txt docs/README.txt
- 输出将显示 Git 识别到的重命名操作:
renamed: README.txt -> README
元数据存储:虽然 Git 不会专门将文件重命名操作记录为单独的文件操作,但它会通过文件内容的指纹来推断出重命名或移动操作。这意味着,如果您查看提交历史,Git 会有效地显示文件的重命名。
合并冲突:在合并分支时,如果两个分支对同一个文件进行了重命名,可能会导致合并冲突。在这种情况下,您需要手动解决冲突。
提交更改:在使用 git mv
重命名或移动文件后,您需要执行 git commit
将这些更改提交到版本历史中:
git commit -m "Renamed README.txt to README"
git mv
命令是 Git 中非常实用的工具,可以方便地重命名和移动文件,同时确保这些操作得到妥善处理和跟踪。有效地使用 git mv
可以帮助您更好地管理文件组织结构,提高项目的整洁性和可维护性。
Git 提供了一系列命令来管理文件的状态,包括 git reset
、git checkout
和 git clean
。这些命令各自有特定的功能,帮助您在不同情况下处理暂存区和工作目录中的文件。以下是对这三个命令的详细解释。
(11)git reset HEAD …
-
功能:取消已经暂存的文件。这意味着您将文件从暂存区中移除,但文件的内容仍然保留在工作目录中。
-
用法:
git reset HEAD <file_name>
-
示例:
git reset HEAD file.txt
这将从暂存区中移除
file.txt
,使其返回到未暂存状态(即修改仍然保留,但不包含在下次提交中)。
(12)git checkout
git checkout
命令是 Git 中用于切换分支和恢复文件的工具。可以通过这个命令在不同的分支之间切换,或者创建新的分支。
切换到指定分支
-
功能:切换到指定的分支。使用此命令时,确保您当前的工作目录是干净的,也就是没有未暂存的更改,或已将更改提交。
-
基本用法:
git checkout <branch>
-
示例:
git checkout master
此命令将切换到
master
分支。
创建并切换到新分支
-
功能:使用
-b
选项可以同时创建一个新分支并切换到该分支。这样可以在创建新分支的同时避免多次输入命令。 -
基本用法:
git checkout -b <new_branch>
-
示例:
git checkout -b feature-1
这条命令会创建一个名为
feature-1
的新分支,并立即切换到该分支。
注意事项
-
干净的工作目录:在切换分支时,Git 要求您的工作目录是“干净的”,也就是说:
- 没有未暂存的更改(即没有未添加到暂存区的修改)。
- 如果有未提交的更改,您可以选择暂存这些更改 (
git add
) 或提交它们 (git commit
)。
-
处理未提交的更改:如果您的工作目录还存在未提交的更改,您可以采取以下几种方式:
- 暂存并提交更改:
git add . git commit -m "Save progress"
- 暂存更改到暂存区,但不提交:
git add .
- 使用
git stash
:暂时保存未提交的更改,切换分支后可以恢复这些更改。git stash git checkout <branch> git stash pop
- 暂存并提交更改:
使用建议
-
git checkout <branch>
:切换到现有分支。 -
git checkout -b <new_branch>
:创建并切换到新分支。 -
确保工作目录是干净的:在切换分支之前,确保没有未提交的更改,以避免冲突和数据丢失。
-
在切换分支之前,始终检查当前的工作状态,确保不会丢失未提交的更改。
-
为新功能或修复创建新分支时,使用描述性强的名称,以便于后续的管理和协作。
git checkout – …
-
功能:这个命令用于放弃对工作目录中某个文件的修改,将文件恢复到最新提交的状态。这意味着您将丢弃所有未提交的更改,恢复到上一个提交版本的状态。
-
用法:
git checkout -- <file_name>
-
示例:
git checkout -- file.txt
这将覆盖
file.txt
,使其内容恢复到上一次提交的状态,任何未提交的更改都会丢失。
(13)git clean
-
功能:删除未跟踪的文件和目录。这是一个危险的操作,因为被删除的文件不能通过 Git 恢复(如果它们没有被添加到版本控制中)。
-
用法:
- 删除未跟踪的文件:
git clean -f
- 删除未跟踪的目录:
git clean -fd
- 进行干运行(只列出将被删除的文件,而不实际删除):
git clean -n
- 删除未跟踪的文件:
-
示例:
git clean -f
这将删除所有未跟踪的文件,而不影响已经添加到暂存区或提交的文件。
已提交的内容:任何已经提交到 Git 的文件都可以通过 git log
和相关命令进行恢复。因此,您不必担心已经提交的更改会丢失。
未提交的内容损失:请记住,未提交的更改(包括用 git clean
删除的文件)将无法恢复。Git 对于未跟踪的文件就像它们从未存在过一样,因此在使用这些命令时要格外小心。
在使用git reset HEAD …、git checkout – …、git clean 这些命令时,一定要谨慎,以避免意外丢失重要数据。建议在进行重大更改之前,确保您的工作已经提交,或对重要文件进行备份。
(14) git diff
git diff
是 Git 中用于查看文件差异的命令,它帮助开发者审查尚未提交的更改。以下是针对 git diff
、git diff --cached
和 git diff <SHA1> <SHA2>
的详细说明。
git diff
-
功能:查看尚未暂存的文件更新了哪些部分。这意味着您可以查看在工作目录中对文件所做的更改,但这些更改尚未通过
git add
添加到暂存区。 -
基本用法:
git diff
-
输出示例:运行
git diff
后,您将看到输出中显示的行:-
表示在当前版本中被删除的行。+
表示在当前版本中新增的行。
-
注意:
git diff
仅显示工作目录与暂存区之间的差异,而不是与上次提交之间的差异。
git diff --cached
(或 git diff --staged
)
-
功能:查看已经暂存的文件和上次提交时的快照之间的差异。这个命令允许您检查即将提交的更改。
-
基本用法:
git diff --cached
-
输出示例:运行
git diff --cached
后,您将看到与git diff
相似的输出,但它会显示的差异是已暂存的内容与上一个提交之间的差异。
git diff <SHA1> <SHA2>
-
功能:查看两个特定提交之间的差异。这对于比较不同提交之间的更改非常有用。
-
基本用法:
git diff <SHA1> <SHA2>
-
示例:
git diff abc1234 def5678
这条命令将显示两个提交(
abc1234
和def5678
)之间的所有差异。
使用建议
-
git diff
:显示尚未暂存的文件的修改内容,帮助您了解当前工作状态。 -
git diff --cached
:显示已暂存的更改与上次提交之间的差异,确保您在提交前可以检查即将提交的内容。 -
git diff <SHA1> <SHA2>
:比较两个提交之间的差异,通常用于审查历史变更。 -
在提交之前,使用
git diff
和git diff --cached
来仔细检查您的更改,确保提交的内容和信息是准确的。 -
使用
git diff <SHA1> <SHA2>
来审查代码的演变,了解功能或修复的背景。
git log
是 Git 中用于查看提交历史的命令,它可以帮助您跟踪代码库中的所有更改。以下是对 git log
、git log --graph
、和 git log --since=2.weeks
的详细说明。
(15) git log
-
功能:查看项目的提交历史,列出所有提交的详细信息,包括提交哈希、作者、日期和提交信息。
-
基本用法:
git log
-
输出示例:运行
git log
后,您将看到类似以下的信息:commit 9fbbf1e4e3c3f7a3a58a2b9b4d6a8236183b8e52 Author: Your Name <your.email@example.com> Date: Mon Oct 16 12:34:56 2023 +0800 修复了登录页面的错误
-
选项:可以使用多种选项来过滤和格式化输出,例如:
git log --oneline
:以简洁格式显示每个提交(仅显示提交哈希和提交信息)。git log -n <number>
:只显示最近的<number>
个提交。
git log --graph
-
功能:以图形化的方式显示分支和合并历史。这对于理解项目的分支结构和合并情况非常有帮助。
-
基本用法:
git log --graph
-
输出示例:运行
git log --graph
后,您将看到一个带有分支结构的图形表示,通常如下所示:* commit 9fbbf1e | Author: Your Name <your.email@example.com> | Date: Mon Oct 16 12:34:56 2023 +0800 | | 修复了登录页面的错误 | * commit abc1234 | Author: Your Name <your.email@example.com> | Date: Sun Oct 15 11:20:30 2023 +0800 | | 添加了用户注册功能 | * commit def5678 Author: Your Name <your.email@example.com> Date: Sat Oct 14 10:00:00 2023 +0800 初始提交
-
结合使用:可以与其他选项结合使用,例如:
git log --graph --oneline --all
这将以简洁的形式显示所有分支的提交历史。
git log --since=2.weeks
-
功能:列出最近两周内的所有提交。这个命令适合快速查看某个时间段内的更改。
-
基本用法:
git log --since=2.weeks
-
输出示例:您将看到所有在过去两周内的提交信息,类似于:
commit 9fbbf1e4e3c3f7a3a58a2b9b4d6a8236183b8e52 Author: Your Name <your.email@example.com> Date: Mon Oct 16 12:34:56 2023 +0800 修复了登录页面的错误
-
其他日期选项:您还可以使用其他日期格式,例如:
--since="2023-10-01"
:列出从2023年10月1日开始的提交。--until="2023-10-15"
:列出直到2023年10月15日的提交。
使用建议
-
git log
:查看所有提交的详细历史信息。 -
git log --graph
:以图形化形式显示分支和合并历史,帮助理解项目的演变。 -
git log --since=2.weeks
:列出最近两周内的提交,方便查看近期的变化。 -
在进行代码审查时,使用
git log
可以帮助您了解哪些更改被引入。 -
使用
git log --graph
可以方便地识别分支合并的情况,特别是在处理多个开发分支时。 -
使用时间范围过滤,可以让您快速聚焦于特定时间段内的工作进展。
1.3 关于远程库的git命令
在使用 Git 进行版本控制和代码管理时,远程仓库的管理是一个重要的环节。以下是有关 Git 远程仓库的一些常用命令及其功能的详细介绍。
1. 查看远程仓库信息
git remote show <remote-name>
- 功能:显示指定远程仓库的详细信息,包括它的 URL 和跟踪的分支。
- 使用方式:
git remote show origin
- 输出内容示例:
* remote origin Fetch URL: exercise@192.168.9.142:scripts Push URL: exercise@192.168.9.142:scripts HEAD branch (remote HEAD is ambiguous, may be one of the following): master test Remote branches: master tracked test tracked Local branch configured for 'git pull': master merges with remote master Local ref configured for 'git push': master pushes to master (up to date)
2. 查看远程仓库中各分支最新更新
git ls-remote [remote-name]
- 功能:列出远程仓库中各分支的最新提交信息。
- 使用方式:
git ls-remote origin
- 输出内容:显示远程分支的引用和它们对应的最新提交哈希值。
3. 添加远程仓库
git remote add <name> <远程仓库URL>
- 功能:向本地 Git 仓库添加一个新的远程仓库。
- 使用方式:
git remote add myremote exercise@192.168.9.142:scripts
- 说明:
<name>
是你为远程仓库起的名字,通常使用origin
作为主远程仓库的名称。
4. 删除远程仓库
git remote rm <name>
- 功能:删除指定的远程仓库。
- 使用方式:
git remote rm myremote
5. 重命名远程仓库
git remote rename <old> <new>
- 功能:重命名已存在的远程仓库。
- 使用方式:
git remote rename origin upstream
- 注意事项:重命名远程仓库时,对应的分支名称也会发生变化。这可能影响到已配置的推送和拉取操作。
在使用 Git 进行版本控制时,fetch
和 pull
是两个非常重要的命令,它们用于从远程仓库获取更新,但其工作方式有所不同。
6. git fetch [remote-name]
-
功能:从指定的远程仓库抓取(下载)所有更新到本地,但不自动合并到当前工作分支。
-
使用方式:
git fetch origin
-
说明:
fetch
命令会将远程仓库中的所有更新(新的提交、分支等)下载到本地,但不会改变当前的工作状态或合并任何更改。- 这使得开发者可以先查看远程的更改,再决定是否合并到当前分支。
-
场景:当你想要检查远程仓库的更新内容,或者在合并之前需要先了解远程的状态时,可以使用
fetch
命令。
7. 使用 git pull
-
功能:从远程仓库抓取更新并自动合并到当前分支。
-
使用方式:
git pull origin master
-
说明:
pull
实际上是fetch
和merge
的组合,首先抓取远程更新,然后将这些更新合并到当前分支中。这意味着,如果远程有更新,当前分支会被相应更新。- 默认情况下,当你克隆一个远程仓库时,Git 会为你创建一个本地分支来跟踪远程的分支。例如,当你运行
git clone
命令时,默认情况下会创建一个本地的master
分支来跟踪远程的master
分支。
-
场景:当你希望将远程仓库的最新更改拉取到当前分支并立即合并时,可以使用
pull
命令。
8. 其他相关命令和概念
-
设置跟踪分支:如果你希望某个本地分支跟踪远程分支,可以在创建分支时使用
-b
选项,或在已经创建后使用--set-upstream-to
选项。示例:git checkout -b mybranch origin/mybranch
或者
git branch --set-upstream-to=origin/mybranch mybranch
-
查看当前跟踪的分支:
git branch -vv
这个命令列出所有本地分支及其对应的远程分支。
使用 Git 进行远程仓库管理是版本控制的一个重要方面。通过上述命令,用户可以方便地查看、添加、删除和重命名远程仓库,从而有效地管理代码的版本和更新。掌握这些基本操作,有助于提高团队协作和代码管理的效率。
在工作流程中,git fetch
和 git pull
各自有其适用场景。fetch
命令适合用于准备和审查更改,而 pull
命令则用于将远程更新直接合并到当前工作分支。在团队协作中,合理使用这两个命令,可以有效地管理代码的版本和更新。
1.4 关于合并代码的git命令
在使用 Git 进行版本控制时,合并代码是一个常见的操作。以下是一些常用的合并命令及其详细说明,包括 merge
、rebase
和 cherry-pick
有效地管理代码的合并过程。
1. git merge <other-branch>
-
功能:将指定的分支(
other-branch
)合并到当前分支。 -
使用方式:
git merge other-branch
-
说明:
- 当您在当前分支上执行
merge
操作时,Git 会将other-branch
的所有更改合并到当前分支中。 - 如果在合并过程中出现冲突,您需要手动解决冲突,Git 会提示您解决冲突的文件。解决后,您需要使用
git add
将修改标记为已解决,然后使用git commit
完成合并。
- 当您在当前分支上执行
-
场景:当您想将其他分支的所有更改合并到当前工作分支时使用。
2. git rebase <other-branch>
-
功能:将当前分支的基础(base)变更为指定的分支(
other-branch
)的最新提交。 -
使用方式:
git rebase other-branch
-
说明:
rebase
会将当前分支的提交“移动”到other-branch
的最新提交之后。这种方式使得提交历史更加线性和整洁。- 和
merge
不同,rebase
会重写提交历史,因此在与他人共享的分支上使用时需谨慎,以免造成混乱。 - 在
rebase
过程中,如果发生冲突,您需要手动解决冲突,完成后使用git rebase --continue
继续操作。
-
场景:当您希望在将当前分支的更改应用到
other-branch
的最新提交之后,并保持提交历史的整洁时使用。
3. git cherry-pick <commit-id>
-
功能:将指定的提交(
commit-id
)应用到当前分支。 -
使用方式:
git cherry-pick <commit-id>
-
说明:
cherry-pick
命令会将特定的提交应用到当前分支,相当于将该提交的更改复制到当前分支。这个方法在您只需要从某个分支中获取特定的更改时非常有用。- 如果该提交与当前分支的更改冲突,您需要手动解决冲突,解决后同样需要使用
git add
和git cherry-pick --continue
完成操作。
-
场景:当您希望将某个特定的提交从其他分支应用到当前分支,但不想合并整个分支时使用。
在使用这些命令时,请注意潜在的冲突,并确保在团队合作时合理管理提交历史,以免给其他开发者带来困惑。
git merge
是用于将整个分支合并到当前分支,适合于将其他开发分支的所有更改整合进来。git rebase
更适合于保持提交历史的整洁,当需要将当前分支基于其他分支的最新状态时使用。git cherry-pick
则是用于选择性地将特定提交应用到当前分支,适合于局部更改的合并。
1.5 gitk图形化查看工具
gitk
是一个非常实用的 Git 图形化界面工具,用于查看和管理 Git 仓库中的提交历史、分支和合并等信息。它提供了一种直观的方式来理解和分析代码变更,便于开发者进行代码审查和历史追溯。
1. 主要功能
(1) 查看提交历史:
gitk
可以显示所有提交的详细信息,包括提交者、提交日期、提交信息以及提交的哈希值。这使得开发者可以方便地浏览代码的演变过程。
(2) 分支和合并管理:
gitk
以图形化方式展示分支和合并的历史,可以清晰地看到不同分支的关系及其合并情况。这对于理解项目的开发过程非常有帮助。
(3) 过滤和搜索功能:
- 用户可以通过输入关键字来快速搜索特定的提交,或者根据作者、时间等条件进行过滤,帮助定位感兴趣的更改。
(4) 显示文件差异:
- 可以查看每个提交中更改的文件及其差异(diff),这对于理解代码的具体变动非常重要。
(5) 支持多种查看方式:
- 用户可以选择不同的视图方式,例如单一视图、多列视图等,以适应个人习惯和需求。
在使用 gitk
进行 Git 仓库的可视化管理时,界面分为多个区域,各个区域有不同的功能。以下是对 gitk
界面的主要区域及其功能的整理:
1.主菜单栏显示区
- 功能:提供基本操作和设置的入口。
- 包括内容:
- 文件菜单:可以打开、保存和退出
gitk
。 - 编辑菜单:包含查找和其他编辑功能。
- 视图菜单:调整可视化的显示设置、过滤选项等。
- 帮助菜单:提供关于
gitk
的帮助文档和使用说明。
- 文件菜单:可以打开、保存和退出
2.提交信息显示区
- 功能:显示选中提交的详细信息。
- 包括内容:
- 节点树:以图形方式展示提交的历史和分支关系。
- 提交信息(Message):显示提交时填写的说明信息,帮助理解该次提交的目的。
- 提交人:显示进行该次提交的作者信息。
- 提交时间:显示提交的具体时间,便于追溯历史。
3.查询条件检索区
- 功能:根据用户输入的条件过滤和查找提交记录。
- 包括内容:
- 输入框:允许用户输入关键词(如提交信息的一部分、提交者的名字等)以进行搜索。
- 过滤器:可选择不同的条件,如按作者、日期范围或提交信息等进行筛选。
4.具体内容显示区
- 功能:显示选中提交的详细变更记录或两个提交之间的差异(diff)。
- 包括内容:
- 当选择某个提交时,显示该提交所做的具体更改。
- 如果同时选择两个提交,显示它们之间的差异,便于比较和审查代码变更。
5.文件列表显示区
- 功能:列出与选中提交相关的文件或两个提交之间的差异文件。
- 包括内容:
- 文件名列表:显示在选中提交中修改的文件或在两个提交之间的不同文件。
- 文件状态:指示文件的状态(如新增、修改或删除),帮助用户快速了解变更的范围。
2. 如何使用 gitk
(1)启动 gitk
-
在终端中,您可以在 Git 仓库的目录下直接输入以下命令来启动
gitk
:gitk
-
如果您想查看特定分支或提交的历史,可以在命令后添加参数:
gitk <branch-name>
或者
gitk <commit-hash>
界面概述
- 提交列表:在左侧,您将看到一个提交历史的列表。每一行代表一个提交,包含提交信息和作者。
- 图形化视图:右侧是图形化视图,显示了分支和合并的情况。
- 文件更改:点击某个提交后,底部区域会显示该提交中修改的文件及其差异。
3. 使用建议
- 进行代码审查:使用
gitk
查看代码变更历史及上下文,帮助团队进行代码审查时理解修改的背景。 - 分支管理:在处理复杂的分支结构时,利用
gitk
可以更容易地识别哪些分支存在未合并的更改。 - 学习和跟踪:通过
gitk
学习项目的开发历史,尤其是大型项目,能够帮助新加入的开发者快速熟悉代码库。
gitk
是一个强大的工具,可以帮助开发者更好地理解和管理 Git 仓库中的历史信息。其图形化界面不仅直观易用,还提供了丰富的功能,适合各种开发场景。对于希望深入了解 Git 提交历史的开发者来说,gitk
是一个非常有价值的工具。
二、如何使用repo?
使用 repo
工具来管理和下载多个 Git 仓库(尤其是 Android 代码树)时,您可以按照以下步骤进行操作:
2.1 下载整个 Android 代码树
1. 克隆 repo
工具:
首先,您需要安装 repo
工具。可以从 Google’s repo
仓库克隆它:
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
2. 将 repo
目录加入到 PATH:
将 ~/bin
添加到您的 PATH
环境变量中,确保您可以在任何地方使用 repo
命令:
export PATH=~/bin:$PATH
您可以将以上命令添加到 ~/.bashrc
或 ~/.bash_profile
中,以便每次启动终端时自动加载。
3. 初始化 repo:
使用 repo init
命令来初始化您的代码树,指定清单:
repo init -u ssh://amazon@code.thunderst.com:amazon/manifest-b
这里的 -u
参数指定了 manifest 的 URL。
4. 同步代码:
使用 repo sync
来下载所有的代码:
repo sync
这个命令会根据 manifest 文件下载相应的 Git 仓库。
2.2 建立本地的工作分支
1. 启动工作分支:
您可以使用 repo start
命令来创建一个新的本地工作分支:
repo start <branch_name> {<git库名(可多个)> | --all}
其中:
<branch_name>
是您想要创建的分支名。<git库名>
是可选的,您可以指定某个或多个 Git 仓库。使用--all
可以在所有仓库中创建该分支。
2. 注意事项
- 冲突处理:在执行
repo sync
时,如果遇到冲突,您需要手动解决这些冲突。 - 提交更改:在工作分支上进行更改后,您可以使用常规的 Git 命令(如
git add
和git commit
)来提交这些更改。
通过这些步骤,您可以有效地使用 repo
来管理和下载整个 Android 代码树,并在本地创建和管理工作分支。
2.3 使用repo的标准工作流程
使用 repo
工具的标准工作流程通常包括初始化仓库、同步代码、创建分支、修改代码,并最终上传更改到代码评审系统。
1. 初始化仓库
repo init -u amazon@code.thunderst.com:amazon/manifest.git -b Amazon
- 说明:此命令用于初始化一个新的
repo
工作区。-u
后跟的是 manifest 仓库的 URL。-b
后跟的是要使用的分支名称,这里是Amazon
。
2. 同步代码
repo sync
- 说明:此命令将会从指定的 manifest 仓库中同步所有项目的最新代码。此步骤确保你的工作树包含最新的代码和文件。
3. 创建和切换到新分支
repo start Amazon <project | --all>
- 说明:此命令用于在指定项目或所有项目中创建一个新的分支。
Amazon
是新分支的名称。<project>
可替换为特定项目的名称,或者使用--all
来对所有项目操作。
4. 进入项目目录
cd your_project_dir
- 说明:切换到需要进行修改的项目目录(
your_project_dir
)。
5. 进行代码编辑
- 在你的项目中进行所需的更改和编辑。可以使用任何代码编辑器或集成开发环境 (IDE)。
6. 检查更改状态
git status
- 说明:查看哪些文件已经被修改。
7. 添加更改的文件
git add <changed file1> <changed file2>...
- 说明:将修改的文件添加到暂存区(staging area)。你可以一次性添加多个文件。
8. 提交更改
git commit -m "Your commit message"
- 说明:提交暂存区的更改到本地仓库,并附上提交信息。确保提交信息清晰且简洁,能够说明所做的更改。
9. 上传更改
repo upload
- 说明:将本地的提交上传到 Gerrit 进行代码审查。
- 如果需要指定某个项目,可以在命令后加上项目名称。
这个标准的工作流程通过 repo
工具有效地组织了项目的开发过程,包括代码的初始化、同步、分支管理、编辑和提交。掌握这一流程有助于开发者在团队中进行协作,同时确保代码的质量和版本管理。确保在每一步都仔细检查状态,有助于避免潜在的错误和冲突。
2.4 repo命令的使用
repo
是一个 Google 开发的工具,用于管理多个 Git 仓库,特别是在 Android 开发中被广泛使用。
1. repo status
- 功能:查看整个工作树(worktree)的状态,包括当前的清理状态和各个仓库的变动情况。
- 使用方式:
repo status
- 输出内容:
- 显示整个工作树的状态,指出是否干净(clean)或有未提交的更改。
- 列出各个仓库的变动情况,如未提交的更改、未追踪的文件等。
2. repo branches
- 功能:查看当前工作树上所有本地分支的情况。
- 使用方式:
repo branches
- 输出内容:
- 列出当前所有本地分支及其状态,包括当前活动的分支。
- 有助于了解各个仓库的分支结构和开发进度。
3. repo abandon <branch_name> {<git库名>|--all}
- 功能:删除指定分支,可以是某个特定的 Git 仓库,也可以是所有仓库。此命令可以被视为
repo start
的逆操作。 - 使用方式:
或者repo abandon <branch_name>
repo abandon <branch_name> --all
- 参数说明:
<branch_name>
:要删除的分支名称。<git库名>
:可选参数,指定要删除分支的特定 Git 仓库。--all
:删除所有仓库中指定的分支。
- 输出内容:
- 确认删除的分支,或显示错误信息(例如,分支不存在)。
4. repo upload [<project>...] | [-replace <project>]
- 功能:向 Gerrit 提交本地的修改,以便进行代码审查。
- 使用方式:
或者repo upload <project>
repo upload --replace <project>
- 参数说明:
<project>
:可选参数,指定要上传的项目名称。如果不指定,则上传所有已修改的项目。--replace
:如果指定了此参数,将替换先前的提交。
- 输出内容:
- 上传成功后,系统将显示相应的确认信息和同步到 Gerrit 的状态。