核心代码
配置用户名/邮箱
best practice
git init #在本地初始化一个仓库
git add . #将当前目录所有的文件加入(注意这里是加入)到缓存区
git commit -m "xxx" #将当前缓存区里的内容提交到本地仓库
git remote add <remote_rep_name> <remote-rep-url> #为本地rep添加以remote rep,其被命名为<remote-rep-name>
git push -u/--set-upstream <remote-rep-name> <local-rep-name/branch> #为remote/local创建连接,并将local rep中的内容上传到remote rep
撤销commit
回退到特定状态
git reset #将之前使用git add暂存的文件从暂存区中移除,但保留在工作目录中的修改(本地项目的内容不会被覆盖)
git reset HEAD^ #这会将 HEAD 指针移动到前一次提交,并将之前的提交内容放回暂存区。但工作目录中的文件修改并不会被撤销,需要使用 git checkout 或者 git restore 恢复到之前的状态。
git reset <commit_hash> #将 HEAD 移动到指定的提交,并且会将该提交之后的修改放回暂存区。但工作目录中的文件修改不会被撤销,需要使用 git checkout 或者 git restore 恢复到之前的状态。
git reset --hard #这会撤销到最后一次提交,并将工作目录中未提交的修改全部删除。
比较
git diff #查看工作目录和暂存区之间的差异
git diff --cached #查看暂存区和最后一次提交之间的差异
git diff HEAD #查看工作目录、暂存区和最后一次提交之间的差异
git diff <commit1> <commit2> #替换 <commit1> 和 <commit2> 分别为两个不同的提交哈希值、分支名或者标签名。这会显示两个提交之间的差异。
git diff <branch1>..<branch2> #这会显示两个分支之间的所有差异。这里有两个小点。
分支合并
checkout
git checkout branch_name #切换到特定branch
git checkout -- file_path
#如果在工作目录中对某个文件做了修改,但还没有提交(文件不在本地仓库,而是在缓存区),执行这个命令可以撤销对该文件的修改,将其还原为最后一次提交的状态(从本地仓库恢复)。
git checkout <commit_hash>
#命令用于将工作目录和暂存区的状态切换到指定提交(commit).这个操作将使得你处于“分离头指针”(detached HEAD)的状态,即不再位于任何分支上,而是直接在某个具体的提交上。注意:在“分离头指针”状态下,任何在这个状态下的新提交都不会属于任何分支,如果切换到其他分支,这些提交可能被遗弃,因此要谨慎使
用。
git checkout -b new_branch_name <commit_hash>
这会创建一个新分支 new_branch_name,并将它切换到指定提交。
注意事项:
- 在合并前最好确保你的分支是最新的,以避免冲突。
- 解决冲突时,仔细检查并确认更改,确保合并后的代码是正确的。
- 在合并前,可以使用
git diff
查看要合并的更改,以确保将正确的更改合并到目标分支
2.23版本以上的git, 提出用git switch和git restore来替代checkout的某些功能
操作过程
git checkout master #切换到目标分支
git pull origin master #确保目标分支是最新的,想想为什么会这样
git merge <feature-branch> #在目标分支上执行合并操作.如果 Git 发现在目标分支和要合并的分支上都对相同文件进行了修改,就会发生合并冲突。在这种情况下,你需要手动解决冲突。编辑冲突文件,然后执行.
git add . #重新添加、提交代码
git commit
git push origin master #推送
工作原理
具体流程如下图所示[1]:
核心概念
push
git push <remote> <branch>
<remote>
是远程仓库的名称,通常是origin
,但也可以是其他已经配置的远程仓库的名称。<branch>
是要推送的本地分支的名称。- 如果远程仓库是在第一次推送时创建的,你可能需要添加
-u
或--set-upstream。
-u
命令的作用是将本地分支与远程分支关联,并将本地分支的变化推送到远程仓库。这通常用于在第一次推送分支时,建立本地分支与远程分支之间的追踪关系。
origin
origin
是默认的远程仓库的名称。origin
的作用是作为默认的远程仓库,方便你推送(push
)和拉取(pull
)代码。例如,当你执行 git push origin master
时,表示将本地的 master
分支推送到名为 origin
的远程仓库。同样,git pull origin master
表示从 origin
远程仓库的 master
分支拉取最新的代码。
HEAD
HEAD
在 Git 中是一个特殊的指针,用于表示当前所在的本地仓库的最新提交。HEAD
指针通常指向当前所在的分支的最新提交,表示你正在工作的分支的最新状态。
以下是 HEAD
的一些常见用途和行为:
-
指向当前分支的最新提交: 当你在一个分支上进行提交时,
HEAD
会随着当前分支的移动而更新,始终指向该分支的最新提交。 -
分离 HEAD: 如果你切换到一个特定的提交,而不是分支(例如,
git checkout <commit_hash>
),HEAD
将进入 "分离头指针" 的状态,这时HEAD
直接指向具体的提交而不是分支。 -
切换分支: 当你使用
git checkout
或git switch
切换分支时,HEAD
会跟着切换到新的分支上,并指向该分支的最新提交。 -
合并分支: 在合并分支时,
HEAD
通常会指向被合并的分支的最新提交。合并完成后,HEAD
会指向新生成的合并提交。 -
指向提交的哈希值: 当
HEAD
处于分离头指针状态时,它直接指向一个具体的提交,而不是一个分支。在这种情况下,你可以通过git log
查看提交的哈希值,然后使用git checkout
或git switch
切换回分支。 -
表示工作区和暂存区的状态:
HEAD
不仅指向最新提交,还包含了工作区和暂存区的状态。在某些操作中,如git reset
,HEAD
可能会移动到之前的提交,同时更新工作区和暂存区。
总体而言,HEAD
在 Git 中是一个非常重要的指针,用于跟踪当前工作目录的状态。理解 HEAD
的位置和作用对于有效地使用 Git 是很重要的。
Reference
[1] 看完这篇还不会用Git,那我就哭了! - 知乎 (zhihu.com)