基础概念
版本控制:Git 让开发者能够跟踪和管理代码的历史版本。每当你提交更新时,Git 都会保存一个“快照”,记录文件的变化。这使得你可以随时回到过去的任何一个版本,查看或者恢复代码。
跟踪变更:Git 提供了强大的工具来查看项目的历史变更,比如 git log
命令可以展示详细的提交历史,git diff
可以显示文件之间的差异。
分布式系统:Git 是一个分布式版本控制系统,这意味着每个开发者的电脑上都有整个项目的完整历史记录的副本。这不仅使得操作更快(因为大部分操作都在本地完成),而且即使远程服务器出现问题,每个副本也可以用作数据恢复的备份。
流程图
3大区域:
工作区(原区+未暂存区) & 暂存区 & 本地库
原区 & 未暂存区 :
——>修改文件
<——git checkout 或者使用git restore
未暂存区 & 暂存区
——>git add
<——git reset 或者使用git restore
暂存区 & 本地库
——>git commit
<——git reset --soft
本地库——>未暂存区:git reset --mixed
本地库——>原区:git reset --hard
暂存区——>原区:git checkout head
未暂存区——>本地库:git commit --
配置相关
git init
git config --global https.sslverify false // 关闭SSL验证
git config --global http.proxy 'http://具体的服务器地址:端口' // 将http代理到指定服务器
git config --global https.proxy 'https://具体的服务器地址:端口' // 将https代理到指定服务器
git config --global --list // 显示git的全局配置
git config --global --unset http.proxy // 取消http和https的代理
git config --global --unset https.proxy
git config --global core.editor [emacs | vim] // 修改编辑器,emacs和vim 二选一
git config --list --show-origin // 查看git配置项及所在文件
// --system影响的是系统配置 --global影响用户配置 --local影响代码仓配置
help
git help <verb> # verb是可选的参数,填充具体的操作指令
git <verb> --help # 跟上面的命令一样,都会跳转到一个页面
man git-<verb>
可服务性
新增简易命令版
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gb='git branch -vv'
alias gr='git remote -v'
# alias gl="git -c 'pager.log=true' -c 'core.pager=less' log --decorate --graph --oneline"
alias gll="git log --pretty=format:'%C(yellow)%h %Cgreen%ad %Creset%s' --date=short"
alias gl='gll -n 20'
alias gllm='gll --merges'
alias glm='gl --merges'
alias gd='git diff'
alias gdc='git diff --cached'
git switch <new-branch-name> # 切换分支
git switch -c <new-branch-name> # 创建分支并切换
git switch --discard-changes <branch-name> # 切换分支,丢弃当前工作区的修改
基于远端分支新拉本地分支并上传
git checkout 远端主分支A
git checkout -b 自己本地新分支B
修改后保存
git push -u origin 自己本地新分支B
checkout
主要用于切换分支 or 恢复工作目录中的文件,适用于在不同的开发线路间进行跳转和版本回溯
git checkout branch-name # 切换到一个已经存在的分支
git checkout -b new-branch-name # 创建并切换到新分支
git checkout -- filename # 恢复工作目录中的文件到最后一次提交的状态
git checkout commit-hash -- filename # 检出一个文件的旧版本
而从Git 2.23开始,git checkout 的部分功能被拆到了新的命令 git switch 和 git restore中,是的命令的用途更加细分明确
git switch 用于切换分支
git restore 用于恢复文件
git switch <new-branch-name> # 切换分支
git switch -c <new-branch-name> # 创建分支并切换
git switch --discard-changes <branch-name> # 切换分支,丢弃当前工作区的修改
HEAD
在Git中,HEAD指针表示当前的工作分支的最新提交,分离HEAD指针即切换到不同的提交或分支,或者在提交历史中向前或向后移动
git checkout HEAD^ # 将HEAD回退一个 commit
git checkout HEAD~n # 将 HEAD 回退多个 commit
分离HEAD
检出之前的提交
git checkout commit-id file-path # 将某个文件检出到 commit-id 版本
git checkout commit-id #
回退修改 restore
git restore 用于撤销对工作目录和暂存区(index)中文件的更改的git命令
撤销工作区中的更改,如果你在工作区中对文件做了修改后想要撤销这些更改,使得文件恢复到最后一次提交的状态
git restore <file>
git restore . # 撤销所有工作区改动
# 撤销暂存的更改
git restore --staged <file>
reset
用于重设当前分支的头指针到另外一个提交(commit),用于撤销提交
将HEAD和暂存区重置到指定的提交,但不影响工作目录 —— 这意味着会更改回到工作目录,你可以重新决定是否重新暂存和提交这些更改
git reset <file> # 撤销暂存区中的文件修改
git reset --soft <commit_hash> # 将 HEAD 移动到指定的提交,工作目录和暂存区现有内容不变。(改动会保留在暂存区)
git reset [--mixed] <commit_hash> # 将 HEAD 和索引重置到指定的 <commit>,工作目录现有内容不变。(改动保留在工作区)。
git reset --hard <commit_hash> # 将 HEAD、索引和工作目录都重置到指定的 <commit>。这意味着所有当前的更改都将被清除,工作目录将反映指定提交的内容。
tips: 结合 reset 和 commit,实现清理提交记录。相比较 rebase -i,这种方式更简单,不需要冲突处理,同时可以对暂存区中的改动做进一步处理。
暂存修改
git stash允许临时保存当前工作目录和暂存区的更改,以便可以切换到其他分支处理其他事务,然后再回来
git stash # 将已修改和已暂存的改动保存起来,注意后面不跟文件
git stash list # 查看stash列表
git stash pop # 将最近的stash弹出,并应用
git stash apply # 只应用,不弹出 / 对应git stash pop
git stash apply stash@{n}
git stash drop # 删除最近的stash
git stash drop stash@{n} # 删除指定stash
rebase相关
rebase能将另外一个分支的修改先插队插入到当前分支
merge会有一条merge的commit记录,而rebase没有。
并且rebase的提交是线性的,非常干净。
且常用于本地开发完成后,使用rebase -i整理提交记录。
注意:rebase会修改提交记录(commit id),因此不要在公共的分支上使用rebase,否则会导致大量冲突。
# 主要用于显示当前分支的名称
git branch --show-current --track
# 真正查看上游分支
git rev-parse --abbrev-ref --symbolic-full-name @{u}
# 设置上游分支
git branch --set-upstream-to=origin/上游分支
# 开始rebase
git rebase
# 处理冲突后
git add file
git rebase --continue
worktree
worktree用于在Git中管理多个工作目录,允许在同一仓库中同时检出多个分支到不同目录
即worktree中的各个分支可以“共用”,用于同时处理多个分支
git worktree add <path> <branch> # 创建额外工作目录,path为新的工作目录
git worktree list # 列出所有活跃的工作目录
git worktree remove <path> # 删除工作目录
添加工作树并且merge
git worktree add ../分支名 origin/分支名
# 在当前Git仓库中添加一个新的工作树(worktree),并将其与指定的远程分支关联起来
git merge 分支名
git更新子仓
git clone -b 指定分支 代码仓地址
git submodule update --init --recursive // 更新子仓
tag处理
用于给特定的提交创建标签,以便标记软件版本的重要节点(如发布和里程碑)
提供了2种类型的标签:轻量标签(lightweight)和带注释的标签(annotated)
git tag <tagname>
git tag <tagname> <commit-hash>
git tag -a <tagname> -m "your message"
git tag -a <tagname> <commit-hash> -m "your message"
git tag # 列出所有标签
git show <tagname> # 查看标签详细信息
git tag -d <tagname> # 删除本地标签
git push --delete origin <tagname> # 删除本地标签,并推送到远程仓库
git push origin <tagname> # 推送特定标签的远程
git push origin --tags # 推送所有标签