git的结构

在 Git 中,有三个主要的区域:工作区、暂存区和本地仓库。

  • 工作区:工作区是项目的实际目录,其中包含您的项目文件和目录。
  • 暂存区:暂存区也称为 Git 索引,是一个缓存区域,用于临时保存更改。在使用 git add 命令后,更改将被添加到暂存区。
  • 本地仓库:本地仓库是 Git 中用于存储历史记录和更改历史记录的地方。在使用 git commit 命令后,更改将被提交到本地仓库中。

理解这些区域的关系是很重要的:

  • 在对文件进行修改后,更改会存在于工作区中。
  • 使用 git add 命令将更改添加到暂存区。
  • 在使用 git commit 命令之前,您可以使用 git status 命令查看当前的状态。这将显示哪些更改已添加到暂存区,哪些更改仍在工作区中等等。
  • 在使用 git commit 命令后,更改将被提交到本地仓库中,并且会生成一个唯一的提交哈希值。
  • 可以使用 git log 命令查看提交历史记录,并使用 git diff 命令比较不同提交之间的差异。
  • 使用 git push 命令将本地仓库中的更改推送到远程仓库。

git命令

  1. git clone: 从远程仓库克隆一个本地副本。
  2. git add: 将更改添加到 Git 的暂存区。
  3. git commit: 将更改提交到 Git 的本地仓库。
  4. git push: 将本地仓库中的更改推送到远程仓库。
  5. git pull: 将远程仓库中的更改拉取到本地仓库中。
  6. git branch: 查看本地分支列表。
  7. git checkout: 切换到另一个分支。
  8. git merge: 将两个分支的更改合并到一起。
  9. git fetch: 从远程仓库获取最新的更改,但不会将其合并到本地仓库。
  10. git status: 查看当前的 Git 状态,例如已修改的文件和未跟踪的文件。
  11. git log: 查看 Git 的提交历史记录。
  12. git reset: 撤销 Git 中的更改。
  13. git stash: 将本地未提交的更改保存到一个临时区域。
  14. git tag: 给 Git 中的特定提交打标签。

场景题

怎么撤销 Git 中的最新提交(commit)

使用 git reset HEAD~ 命令将 HEAD 回退到上一个 commit,并且将暂存区和工作目录中的文件恢复到该 commit 中的状态。

git reset会丢失代码吗?

执行 git reset HEAD <file> 命令会将暂存区中的 <file> 文件恢复到最近一次 commit 的状态,这不会影响工作区中的文件。

执行 git reset HEAD 命令会将暂存区中的所有修改都恢复到最近一次 commit 的状态,这同样不会影响工作区中的文件。

如果您在执行 git reset HEAD 或者 git reset HEAD <file> 命令之前对工作区中的文件进行了修改并且这些修改尚未提交,那么这些修改会被还原到之前的状态,从而影响了工作区。

总的来说,git reset HEAD 命令的作用是将暂存区中的修改回退到上一次 commit 的状态,这并不会直接影响工作区中的文件。但是如果工作区中的文件已经被修改了并且未提交,那么这些修改将会被还原到之前的状态,从而影响了工作区。

怎么撤销add操作?

当您使用 git reset HEAD <file> 命令时,它会将指定的文件从暂存区中移除,相当于撤销了使用 git add 命令将文件添加到暂存区中的操作。这样您可以重新编辑该文件,然后使用 git add 将其重新添加到暂存区中。

如果您使用 git reset HEAD 命令时不指定文件名,它会将暂存区中的所有文件都移除。

git怎么撤销已提交到远程仓库的代码?

  1. 使用 git log 命令查看要撤销的提交的哈希值。

  2. 使用以下命令将本地分支重置为要撤销的提交之前的状态:

    1
    git reset --hard <要撤销的提交之前的提交的哈希值>
  3. 使用以下命令将本地分支强制推送到远程分支:

    1
    git push -f origin <分支名称>

请注意,这将会覆盖远程分支中的代码,因此请确保您知道自己在做什么并且需要这样做。此外,请确保您已经与其他开发人员沟通,并告知他们您将要重置分支的操作,以避免造成冲突。

如果只想恢复仓库中的某些文件或目录而不是整个仓库?

1
git checkout <commit-hash> -- <file-path>

请将 <commit-hash> 替换为要恢复的提交的哈希值,将 <file-path> 替换为要恢复的文件或目录的路径。该命令将从指定提交中检出文件或目录,并将其覆盖当前工作目录中的文件或目录。

请注意,这些操作都会更改 Git 仓库的状态,因此在执行任何更改之前,建议您先备份重要的文件或目录。同时也请注意,在协作开发时,不要在公共分支中执行这些操作,以免影响其他开发人员的工作。

git reset –soft

如果您想保留提交之后的更改,您可以使用 git reset --soft <commit-hash> 命令,这将将仓库的 HEAD 移动到指定的提交,但是保留工作树和暂存区中的更改。

  1. 使用 git log 命令查看提交历史记录,并找到要回滚到的提交的哈希值。
1
2
luaCopy code
git log --oneline
  1. 使用 git reset --soft 命令将 HEAD 移动到指定的提交,同时保留工作树和暂存区中的更改。请将 <commit-hash> 替换为要回滚到的提交的哈希值。
1
2
cssCopy code
git reset --soft <commit-hash>
  1. 使用 git status 命令检查工作树和暂存区中的更改。这些更改将保留在工作树和暂存区中,并标记为未暂存的更改(即未提交的更改)。
  2. 使用 git diff 命令查看工作树中的更改,并决定哪些更改需要提交,哪些需要撤消。请将 <file-name> 替换为要查看更改的文件名,或者省略 <file-name> 以查看所有更改。
1
2
phpCopy code
git diff <file-name>
  1. 使用 git add 命令将要提交的更改添加到暂存区。
1
2
csharpCopy code
git add <file-name>
  1. 使用 git commit 命令提交更改,并添加提交消息。
1
2
sqlCopy code
git commit -m "commit message"

git stash的使用场景

git stash 命令可以将当前工作目录中的未提交更改保存起来,并将工作目录恢复到干净的状态,以便进行其他操作,如合并、切换分支等。这个功能非常有用,特别是当您需要紧急修复某个问题而又不希望影响当前正在进行的工作时,或者在切换分支之前需要保存一些更改以便以后恢复时使用。

以下是一些常见的使用场景:

  1. 保存当前未提交的更改:当您正在进行一些更改,但需要先处理其他事情,如合并其他分支或切换到其他分支时,可以使用 git stash 命令将未提交的更改保存到一个堆栈中,以便稍后恢复。
  2. 切换到其他分支:当您需要切换到其他分支但当前的工作目录中存在未提交的更改时,可以使用 git stash 命令将更改保存起来,并将工作目录恢复到干净的状态,然后可以轻松地切换到其他分支。
  3. 处理紧急情况:当您需要紧急修复某个问题时,但当前的工作目录中存在未提交的更改,可以使用 git stash 命令将更改保存起来,并将工作目录恢复到干净的状态,以便快速修复问题。
  4. 暂时不想提交:当您正在进行一些更改,但还不想提交它们时,可以使用 git stash 命令将更改保存起来,并将工作目录恢复到干净的状态。然后您可以继续进行其他工作,稍后再决定是否提交这些更改。

总之,git stash 命令是一个非常有用的功能,可以帮助您在工作目录中存在未提交更改时进行其他操作,同时还能保证不会丢失任何更改。

stash后怎么恢复?

  1. git stash list:查看所有保存在堆栈中的 stash 记录,它们分别对应一个唯一的标识符。
  2. git stash apply [stash@{n}]:应用堆栈中指定标识符 stash@{n} 对应的 stash 记录,并将保存的更改应用到当前分支上。默认情况下,git stash apply 命令将应用最新的 stash 记录。您也可以使用 git stash apply stash@{n} 命令来应用其他 stash 记录。
  3. git stash pop [stash@{n}]:应用堆栈中指定标识符 stash@{n} 对应的 stash 记录,并将该 stash 记录从堆栈中删除。如果您没有指定标识符,git stash pop 命令将默认应用最新的 stash 记录。如果您想要保留 stash 记录并且需要多次应用它,则应该使用 git stash apply 命令。
  4. git stash drop [stash@{n}]:从堆栈中删除指定标识符 stash@{n} 对应的 stash 记录。默认情况下,git stash drop 命令将删除最新的 stash 记录。
  5. git stash clear:清空堆栈,删除所有的 stash 记录。