git 工作流程
工作区

文件状态

git init 初始化仓库
Git - git-init Documentation (git-scm.com)
该命令创建一个空的 Git 存储库 - 本质上是一个 .git 目录,其中包含 objects、refs/heads、refs/tags和模板文件。还将创建一个引用master分支 HEAD 的初始 HEAD 文件。
在一个 git 仓库里用这个命令不会产生不良后果。
If the
$GIT_DIRenvironment variable is set then it specifies a path to use instead of./.gitfor the base of the repository.
git add
在一个阶段的工作完成后,仓库中会多出一些文件,可以用 git status 查看多出了哪些文件,再通过 git add -A 命令可以将当前目录下所有文件加到暂存区,如果不想将所有文件都加到暂存区,可以使用单独的文件名.。通过配置 .gitignore 也可以拒绝用 git 跟踪某些文件。
The git add command will not add ignored files by default. If any ignored files were explicitly specified on the command line, git add will fail with a list of ignored files.
如:
The following paths are ignored by one of your .gitignore files:
test.txt如果加上 -n 参数,那么这次 git add 命令不会真的生效,只是在命令行显示会 add 什么文件。
git rm
将文件从暂存区和工作区中删除:
git rm <file>
如果想把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 —cached 选项即可:
git rm --cached <file>
这里也可以用 git restore --staged filename
可以递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件:
git rm –r *
git mv
可以给一个已经被追踪的文件改名(利用-f 参数可以强制覆盖已经存在的文件)
git mv oldfilename newfilename
git stash
如果我们正在 dev 分支开发,但是目前功能还没有完成,不值得 commit,但是有紧急情况需要 checkout 到 master,直接 checkout 是不行的会污染 master 的工作区, git stash 就可以帮助我们将暂存区和工作区的文件隐藏保存起来
git stash
等到我们需要回到 dev 工作,执行
git stash pop 就可以继续之间的工作了
可以使用 git stash list 查看当前 stash 的东西,输出如下
stash@{0}: WIP on new: fe6ecaf update main
如果一次工作中有多次 stash,可以使用
git stash save "message"
这样可以标记当前 stash,否则在同一个 commit 下多次 stash 时 stash list 的信息会非常相似难以辨别。
通过如下方法能取出你想要的 stash
git stash apply stash@{index} 或者 git stash pop stash@{index}
将指定index的储藏从储藏记录列表中删除 `git stash drop stash@{index}
git commit
前面章节我们使用 git add 命令将内容写入暂存区。
git commit 命令将暂存区内容添加到本地仓库中。
提交暂存区到本地仓库中:
git commit -m [message]
[message] 可以是一些备注信息。
提交暂存区的指定文件到仓库区:
$ git commit [file1] [file2] ... -m [message]
-a 参数设置修改文件后不需要执行git add命令,直接来提交
git fetch
git fetch origin main:temp 拉取远端的main为temp
git diff temp 对比本地仓库和temp
git merge temp
git branch
添加分支 git branch name
合并分支 git merge name 合并分支可能会产生冲突,需要时手动解决
删除分支 git branch -d name
切换分支 git checkout name 注:这里 name 也可以是 SHA 但是会让 head 指针游离
git checkout
checkout 本意是检出的意思,也就是将某次 commit 的状态检出到工作区;所以它的过程是先将 HEAD 指向某个分支的最近一次 commit,然后从 commit 恢复 index,最后从 index 恢复工作区。
git checkout -b branchname 创建并切换到新的分支.
这个命令是将git branch newbranch和git checkout newbranch合在一起的结果。
同时, 要跳转到某个历史提交,你可以使用 git checkout 命令。git checkout 允许你将 HEAD(当前分支)指向特定的提交,以浏览和恢复历史状态。
-
首先,使用以下命令查看提交历史,获取你要跳转的提交的哈希值(commit hash)或提交引用(如分支名):
git log这将显示项目的提交历史,包括每个提交的哈希值、作者、日期等信息。
-
选择你想要跳转到的提交,并获取其哈希值。
-
使用以下命令来跳转到特定的提交:
git checkout <commit-hash>将
<commit-hash>替换为你要跳转的提交的哈希值。例如,如果要跳转到某个提交的哈希值为
c1a1b2c,则使用以下命令:git checkout c1a1b2c执行命令后,Git 将更新你的工作目录,将其重置为所选提交的状态。
请注意,这将使你进入分离 HEAD(detached HEAD)状态,意味着你将不再位于任何分支上。在这种状态下,你可以查看历史提交和进行一些其他操作,但不能直接进行提交。如果你想基于该历史提交创建新的分支,可以使用 git checkout -b <branch-name> 命令创建一个新分支。
如果你想返回到当前分支上最新的提交,可以使用以下命令:
git checkout <branch-name>将 <branch-name> 替换为你想要返回的分支名。
放弃修改
如果不指定切换到哪个分支,那就是切换到当前分支,虽然HEAD的指向没有变化,但是后面的两个恢复过程依然会执行,于是就可以理解为放弃index和工作区的变动。但是出于安全考虑 git 会保持 index 的变动不被覆盖。
1、只放弃工作区的改动,index 保持不变,其实就是从当前 index 恢复 工作区:
放弃工作区中全部的修改
git checkout .
放弃工作区中某个文件的修改:
git checkout -- filename
git restore filename 也可以做到同样的事情
2、强制放弃 index 和 工作区 的改动:
git checkout -f
也可以从另一个分支拉取文件
git checkout branchnew filename
git merge
git merge src 将src的commit与当前分支合并,形成一个四边形commit图
git rebase
git rebase src 将当前分支变基到src分支的最新提交上,能够简化非必要的merge,让commit图清晰
同时,一个分支上,如果又多次零碎的提交,你想让历史记录更加清晰,也可以使用git rebase HEAD~N, N就是你想合并的记录的个数。
git rebase 的缺点就是修改了历史提交记录,有时候需要用-f强制推送到远端。
git reset
提交记录最终会形成一个树,可以通过 git reset "hash code" 的方式更改当前代码版本,如果发现 reset 错误,也可以通过 git reflog 找回之前的版本。
reset —hard:重置stage区和工作目录
reset —soft:保留工作目录,并把重置 HEAD 所带来的新的差异放进暂存区
reset 不加参数(mixed):保留工作目录,并清空暂存区
git log
可以使用 glog 命令(这是一个我自己配置的 alias)查看提交记录,显示如下:
在 vscode 中使用 gitlens 更方便
更换到了gitgraken, 免费版用github desktop也行

git push
如: git push -u origin master
-
git push: 将本地代码推送到远程 Git 仓库git push表示将本地分支的最新修改推送到远程分支origin是远程仓库的名称,通常默认为originmaster是本地分支名称,也是远程分支名称,表示将本地master分支推送到远程仓库的master分支
-
-u参数:指定本地分支与远程分支的关联-u或--set-upstream表示指定本地分支与远程分支的关联,之后可以使用git push命令来快速推送修改origin master表示将本地master分支与远程origin/master分支关联起来,之后就可以使用git push命令来快速推送修改
注意事项:
- 在执行
git push命令之前,需要先执行git add命令将修改添加到暂存区 - 如果远程分支不存在,需要使用
git push -u origin new_branch命令来创建远程分支 - 如果本地分支与远程分支的名称不同,需要使用
git push origin local_branch:remote_branch命令来推送修改
git config
git remote set-url origin https://<your_token>@github.com/<USERNAME>/<REPO>.git
git 常见问题
常用命令简化
alias glog='git log --oneline --decorate --graph
代理问题
设置代理
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
取消全局代理:
git config --global --unset http.proxy
git config --global --unset https.proxy
git 设置用户名和邮箱
git config --global user.name "username"
git config --global user.email "email"
git将本地仓库推送到远端空白仓库
在github上创建空白仓库后会提供对应的命令