Git - 记录更改



将更改记录到存储库意味着

  • 在克隆期间,远程 Git 存储库中的每个文件的完整副本都将下载到您的本地计算机。

  • 您可以不受限制地访问此本地副本中的文件进行编辑和修改。

  • 您可以使用 Git 控制要保留哪些修改。

  • 更改可以保持未跟踪(未包含在提交中)或跟踪(包含在后续快照或提交中)。

  • 尚未上传以进行跟踪的任何新文件或现有文件都称为未跟踪文件。克隆后,所有文件最初都被视为已跟踪且未更改。

Git 中的三种状态

在 Git 中的文件生命周期中,文件可以处于三种主要状态

Git 会跟踪自上次提交(快照)以来文件的修改。

  • 已修改:通过暂存已修改的文件,您可以选择其中哪些文件包含在下一个快照中。

  • 已暂存:通过提交,每个暂存的更改都将捕获到单个快照中。

  • 已提交:在处理项目时,您将重复编辑、暂存和提交的循环。

检查文件的状态

验证 Git 存储库中文件状态的最便捷方法是使用git status命令。

$ git status

克隆后,运行git status可以准确了解文件及其当前状态。

输出消息如下

On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

这表示工作目录干净,没有已修改的跟踪文件或未跟踪文件。

它还会识别当前分支,并确认它没有偏离服务器的分支,通常是主分支。

$ echo 'myGymProj' > README
$ git status

输出消息如下

On branch gym-project
Your branch is ahead of 'origin/gym-project' by 3 commits.
   (use "git push" to publish your local commits)

Untracked files:
   (use "git add ..." to include in what will be committed)
         README

nothing added to commit but untracked files present (use "git add" to track)   

git status命令在Untracked files部分列出未跟踪的文件。

Git 不会自动跟踪新文件。您需要告诉 Git 使用 git add 命令开始跟踪它们。这可以确保意外文件不会包含在提交中。

跟踪新文件

要开始跟踪新文件,请使用git add。然后 Git 将在即将进行的提交中识别它。

添加文件后,您可以通过运行git status来验证它是否已跟踪并准备好提交。

$ git add README

执行 git status 时会显示Changes to be committed,表示已为下一次提交暂存的文件。

就像git add开始跟踪这些已暂存的文件一样,提交会记录其当前版本。

$ git add about_us.html
$ git status

输出消息如下

On branch gym-project
Your branch is ahead of 'origin/gym-project' by 3 commits.
   (use "git push" to publish your local commits)

Changes to be committed:
   (use "git restore --staged ..." to unstage)
      new file:   about_us.html   

您可以使用git add将整个目录或特定文件添加到暂存区,包括之前使用git init添加的文件。

暂存已修改的文件

编辑时,已跟踪的文件(如 homePage.html)不会立即被暂存。它们在Changes not staged for commit下使用 git status 列出。

这意味着在提交之前必须使用git add暂存更改,因为它们不会被捕获到下一次提交中。

$ git status

输出消息如下

On branch gym-project
Your branch is ahead of 'origin/gym-project' by 3 commits.
   (use "git push" to publish your local commits)

Changes to be committed:
   (use "git restore --staged ..." to unstage)
         new file:   about_us.html

Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git restore <pre>..." to discard changes in working directory)
         modified:   homePage.html
  • Changes not staged for commit列列出了homePage.html文件,表明已跟踪的文件已编辑但尚未准备好提交。

  • git add命令用于暂存更改。git add是一个灵活的工具,可用于跟踪新文件、解决合并冲突和暂存文件。

  • 建议使用git add暂存 Test.htm 文件,然后使用git status验证状态。

$ git add homePage.html
$ git status

输出消息如下

On branch gym-project
Your branch is ahead of 'origin/gym-project' by 3 commits.
   (use "git push" to publish your local commits)

Changes to be committed:
   (use "git restore --staged ..." to unstage)
         new file:   about_us.html
         modified:   homePage.html
  • 暂存后,这两个文件都将包含在您即将进行的提交中。

  • 假设此时您想到对homePage.html进行最后一次修改,然后再提交它。

  • 进行调整并再次打开它后,您就可以准备提交了。

但首先,让我们再次执行 git status

$ vim homePage.html
$ git status

输出消息如下

On branch gym-project
Your branch is ahead of 'origin/gym-project' by 3 commits.
   (use "git push" to publish your local commits)

Changes to be committed:
   (use "git restore --staged ..." to unstage)
         new file:   about_us.html
         modified:   homePage.html   
  • 目前存在homePage.html的已暂存和未暂存版本。当您使用git add时,Git 会按原样暂存文件。

  • 如果您现在提交,则您最近的git add命令时工作目录中homePage.html的版本将包含在提交中。

  • 要暂存文件的最新版本,必须在对homePage.html进行更改后再次运行git add

$ git add homePage.html
$ git status

输出消息如下

On branch gym-project
Your branch is ahead of 'origin/gym-project' by 3 commits.
   (use "git push" to publish your local commits)

Changes to be committed:
   (use "git restore --staged ..." to unstage)
         new file:   about_us.html
         modified:   homePage.html

简短状态

可以使用git status全面查看 Git 存储库的文件状态。

使用-s--short标志从 git status 获取更简短的输出版本,以便更易于阅读。这简化了搜索特定更改的过程。

$ git status -s

输出消息如下

A  about_us.html
M  homePage.html
?? .homePage.html.swp

git status -s命令使用代码提供存储库状态的简要视图

  • ?? - 新的未跟踪文件

  • A - 新添加的文件

  • M - 已修改的文件(和其他文件)

输出显示在两列中

  • 左侧 - 暂存区状态(准备好提交的内容)

  • 右侧 - 工作目录状态(文件的当前状态)

忽略文件

在项目的根目录中,创建一个 .gitignore 文件,以排除 Git 不跟踪的不需要的文件。

.gitignore文件中列出要匹配和排除的模式。这可以阻止这些不必要的文件意外提交。

$ cat .gitignore

此类文件的示例包括

  • 日志

  • 临时文件(tmp 目录)

  • 进程 ID (pid) 目录

  • 自动生成的文档

$ cat .gitignore

输出消息如下

# no .a files
*.a

# but do track lib.a, even though you're ignoring .a files above
!lib.a

# only ignore the root TODO file, not subdir/TODO
/TODO

# ignore all files in the build/ directory
build/

# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt

# ignore all .txt files in the doc/ directory
doc/**/*.txt

创建.gitignore文件以防止提交不必要的文件。

  • 忽略注释(带 # 的行)和空行。

  • 使用 glob 模式匹配文件

    • * 匹配任意数量的字符(例如,*.log)

    • [] 匹配括号内的字符(例如,[abc])

    • ? 匹配单个字符

    • [0-9] 匹配一系列字符(例如,数字 0-9)

    • ** 匹配嵌套目录(例如,a/**/z)

  • /开头模式以仅忽略特定文件(而不是子目录)。

  • /结尾模式以定位目录(例如,tmp/)。

  • !为前缀的模式以否定规则(例如,包含 README.md)。

查看已暂存和未暂存的更改

git status提供了工作目录中更改的简洁概述。

  • 它列出已修改、已暂存或未跟踪的文件。

  • 使用git status大致了解发生了哪些更改。

  • 相反,git diff提供了实际编辑的详细视图。

  • 它显示逐行添加和删除,就像修改的补丁一样。

  • 当您需要查看对文件进行的精确编辑时,请使用git diff

$ git status

在没有任何参数的情况下键入git diff以检查您所做的但尚未暂存的更改。

$ git diff

输出消息如下

diff --git a/homePage.html b/homePage.html
index 994cc5a..9e40d3c 100644
--- a/homePage.html
+++ b/homePage.html
@@ -47,7 +47,7 @@
         }
         .navbar li{
               display: inline-block;
-            font-size: 20px;
+            font-size: 22px;

         }
         .navbar li a{
@@ -94,7 +94,7 @@
         </div>
         <!-- right for logo -->
         <div class="right">
-            <button class="btn">Call Us</button>
+            <button class="btn">Contact Us</button>
<button class="btn">Email Us</button>
</div>
</header>   

通过比较工作目录中的更改与暂存区,git diff命令突出显示尚未暂存的更改。

使用git diff --staged查看已为下一次提交暂存的更改,方法是将它们与之前的提交进行比较。

$ git diff --staged

输出消息如下

diff --git a/about_us.html b/about_us.html
new file mode 100644
index 0000000..e69de29
diff --git a/homePage.html b/homePage.html
index 3abf58d..994cc5a 100644
--- a/homePage.html
+++ b/homePage.html
@@ -99,7 +99,7 @@
   </div>
   <header>
   <div class="Container">
   -        <h2>Join the best gym of Delhi now</h2>
   +        <h2>Join the best gym of Pune now</h2>
   </div>
   <body>  

git diff仅显示未暂存的修改;它不会显示自上次提交以来所做的所有更改。

如果所有更改都已暂存,则git diff将不返回任何内容。

一旦homePage.html文件已暂存并编辑,您就可以使用git diff查看文件中已暂存和未暂存的更改。

$ git status

输出消息如下

On branch gym-project
Your branch is ahead of 'origin/gym-project' by 3 commits.
   (use "git push" to publish your local commits)

Changes to be committed:
   (use "git restore --staged ..." to unstage)
         new file:   about_us.html
         modified:   homePage.html

Changes not staged for commit:
   (use "git add ..." to update what will be committed)
   (use "git restore ..." to discard changes in working directory)
         modified:   homePage.html   

目前,您可以使用git diff查看哪些内容仍未暂存

$ git diff

输出消息如下

diff --git a/homePage.html b/homePage.html
index 9e40d3c..dbf6cf4 100644
--- a/homePage.html
+++ b/homePage.html
@@ -80,7 +80,7 @@
         <div class="left">
         <img src="img/dumbbell.jpg" alt="">
-                <div>ABC Fitness</div>
+                <div>XYZ Fitness</div>
         </div>

您可以使用git diff --cached查看您迄今为止已暂存的更改。

值得注意的是,在此上下文中--staged--cached是同义词。

$ git diff --cached

输出消息如下

diff --git a/about_us.html b/about_us.html
index e69de29..9a1eb8d 100644
--- a/about_us.html
+++ b/about_us.html
@@ -0,0 +1 @@
+<h1>Hello World</h1>
\ No newline at end of file
diff --git a/homePage.html b/homePage.html
index 9e40d3c..dbf6cf4 100644
--- a/homePage.html
+++ b/homePage.html
@@ -80,7 +80,7 @@
      <div class="left">
      <img src="img/dumbbell.jpg" alt="">
      -                <div>ABC Fitness</div>
      +                <div>XYZ Fitness</div>
      </div> 

提交更改

您可以使用暂存区微调哪些修改是提交的一部分。

  • 未暂存的修改将不会包含在内,例如尚未通过 git add 添加的新添加或修改的文件。

  • 使用 git commit 提交所有已暂存的更改。

  • 这以先前 git status 验证一切是否按计划暂存为前提。

$ git commit

当您运行git commit时,编辑器将打开,其中包含已注释掉的最新 git status 输出。

您可以:

  • 删除这些注释并编写您自己的提交消息。

  • 保留这些注释作为正在提交内容的参考。

  • 保存并退出编辑器后,Git 将使用您的消息(不带注释或差异)创建提交。

git commit

您可以跳过编辑器!您可以在 git commit 命令之后使用-m标志直接编写提交消息。

例如:git commit -m "Fixed Test.htm"。这避免了打开编辑器,并允许您内联包含消息。

$ git commit -m "changed the name"

输出消息如下

[gym-project 5c4824d] changed the name
2 files changed, 2 insertions(+), 1 deletion(-)  

跳过暂存区

尽管暂存区有助于进行精确提交,但它也会增加复杂性。

  • Git 提供了一个快捷方式git commit -a来避免暂存。

  • 因为此命令会在提交之前自动暂存所有已跟踪的文件,所以不需要git add

  • 当您希望一次提交所有更改时,它可以简化工作流程。

$ git commit -a -m "added h2 tag"

输出消息如下

[gym-project c2a4e75] added h2 tag
1 file changed, 2 insertions(+), 1 deletion(-)  

通过使用git commit -a(或 —all),您可以绕过单独的git add步骤,并在提交之前自动暂存所有已跟踪的文件。

但请注意,它包含所有记录的更改,其中可能包括意外的更改。考虑使用 git add 结合暂存区以获得更精确的控制。

删除文件

当您从 Git 仓库中删除文件时,需要从两个地方删除它

  • 工作目录:这是您文件的本地副本。

  • 暂存区:您已准备好进行下一次提交的文件都存储在此处。

  • 您可以使用git rm命令来实现此目的。通过这样做,文件将从这两个位置删除,并确保将来不会作为未跟踪文件重新出现。

当您直接从工作目录中删除文件而不使用git rm时,它会在git status输出的未暂存以供提交的更改部分中列出。

$ rm about_us.html
$ git status

输出消息如下

On branch gym-project
Your branch is ahead of 'origin/gym-project' by 6 commits.
   (use "git push" to publish your local commits)

Changes not staged for commit:
   (use "git add/rm <file>..." to update what will be committed)
   (use "git restore <file>..." to discard changes in working directory)
         deleted:    about_us.html

no changes added to commit (use "git add" and/or "git commit -a")   

随后,执行git rm将文件删除操作暂存。

$ git rm about_us.html

输出消息如下

rm 'about_us.html'
$ git status

输出消息如下

On branch gym-project
Your branch is ahead of 'origin/gym-project' by 6 commits.
   (use "git push" to publish your local commits)

Changes not staged for commit:
   (use "git add/rm <file>..." to update what will be committed)
   (use "git restore <file>..." to discard changes in working directory)
         deleted:    about_us.html

no changes added to commit (use "git add" and/or "git commit -a")   
  • 删除跟踪文件:提交后,文件将从 Git 的跟踪和您的工作目录中删除。

  • 强制删除:如果文件已修改或已暂存,请使用-f选项强制删除它。这可以防止意外删除未提交的更改。

  • 保持文件未跟踪:使用--cached选项仅从暂存区删除文件。

  • 如果您错误地添加了文件或希望将其保留在工作目录中但将其从版本控制中排除,这将很有用。

$ git rm --cached Test.htm    

文件、目录和文件通配符模式都是git rm命令可接受的参数。凭借这种灵活性,您可以执行以下任务

$ git rm docs/\*.txt

为了阻止 Git 展开文件名,此命令删除 docs/ 目录中任何具有 .txt 扩展名的文件。

移动文件

Git 重命名文件的机制:与其他一些版本管理系统不同,Git 没有明确记录重命名文件时发生的移动操作。

  • 这意味着重命名文件会在首先删除文件后创建一个新文件。

  • 但是,Git 使用高级算法稍后以智能的方式识别这些重命名。

Git 能够使用mv命令在存储库中重命名文件,而无需显式跟踪文件传输。

$ git mv file_from file_to\

当您运行这样的命令并检查状态时,Git 实际上会将其识别为已重命名的文件

$ git mv homePage.html home_page.html
$ git status

输出消息如下

On branch gym-project
Your branch is ahead of 'origin/gym-project' by 6 commits.
   (use "git push" to publish your local commits)

Changes to be committed:
   (use "git restore --staged <file>..." to unstage)
         deleted:    about_us.html
         renamed:    homePage.html -> home_page.html

无论使用何种方法(手动或 git mv),Git 都会智能地检测重命名。虽然git mv提供了一个方便的一步式解决方案,但 Git 保持其灵活性。

在提交之前,您可以使用任何工具处理添加/删除阶段和重命名。

广告