Git 的使用
1. 频繁使用的工作流命令
clone 克隆代码
bash
git clone https://github.com/shenxgan/devops.git
git clone git@github.com:shenxgan/devops.git
# 快速下载指定分支代码
git clone --depth=1 -b {branch} https://{user}:{token}@{url}
branch 查看分支
bash
git branch # 查看当前本地分支
git branch -a # 查看所有分支,包括远程仓库分支
git branch -D dev # 删除本地 dev 分支
checkout 新建并切换分支
bash
# 在本地新建 dev 分支,并切换到此分支;分支从远程 main 分支中切出
git checkout -b dev origin/main
git checkout README.md # 放弃 README.md 文件的修改
status 查看所有改动
bash
git status
diff 查看改动内容详情
bash
git diff # 查看当前所有改动
git diff README.md # 仅查看 README.md 文件的改动
add 添加改动文件
bash
git add . # 添加当前目录以及子目录的所有变动文件
git add linux/ # 添加 linux 目录及其子目录的文件
git add README.md # 仅添加 README.md 文件
commit 提交改动
bash
git commit -m "first commit." # 提交改动,引号里为此次提交描述
commit
之后可以通过git log
查看- 在
push
之前,commit
记录仅存于本地 - 本地的
commit
可以通过git reset
命令回退
pull 拉取/更新代码
bash
git pull
# 从远程 main 分支更新代码,如果当前不是 main 分支,则会将远程 main 分支代码合并到本地当前分支
git pull origin main
push 上传提交改动
bash
git push
git push origin main # 推送到远程 main 分支
log 查看提交日志
bash
git log # 查看所有 commit 记录
git log -p # 查看所有 commit 记录,并包含每次 commit 的所有改动详情
git log -p README.md # 查看 README.md 文件的改动详情记录
git log --stat # 列出每次 commit 修改的文件列表
reset 重置状态
bash
# 如果不小心将 README.md 文件添加到了待提交文件,则此命令可以将其移出
git reset README.md
# 将当前本地代码回退到指定的 commit,commit_id 通过 git log 查看获取
git reset --soft {commit_id} # 保留所有的改动
git reset --hard {commit_id} # 不保留改动
tag 标签操作
bash
git tag # tag 列表
git tag -a {tag_name} # 创建 tag
git tag -a {tag_name} {commit_id} # 根据历史 commit_id 创建 tag
git tag -d {tag_name} # 删除 tag
git push origin --tags # 推送所有 tag 到远程代码仓库
2. 偶尔使用的命令
回退第一次 commit
bash
git update-ref -d HEAD
https://stackoverflow.com/questions/6632191/how-to-revert-initial-git-commit
回退指定文件
bash
git checkout efebff7c9c8332966729b00cd5f4366a8f86cc5e script/test.py
回退到历史 commit
bash
git reset --soft {commit_id} # 保留所有的改动
git reset --hard {commit_id} # 不保留改动
- commit_id 通过
git log
查看获取
清理当前所有改动,不包括新增文件
bash
git checkout -- .
清理当前工作目录所有修改,包括新文件
bash
git clean -fd
清理所有 commit 历史
bash
# Check out to a temporary branch:
git checkout --orphan TEMP_BRANCH
# Add all the files:
git add -A
# Commit the changes:
git commit -am "Initial commit"
# Delete the old branch:
git branch -D master
# Rename the temporary branch to master:
git branch -m master
# Finally, force update to our repository:
git push -f origin master
https://gist.github.com/heiswayi/350e2afda8cece810c0f6116dadbe651
设置 git 编辑器为 vim
bash
git config --global core.editor "vim"
修改最近的 commit 内容
bash
git commit --amend
临时隐藏改动
bash
git stash # 隐藏改动
git stash pop # 恢复隐藏
- 在
git pull
提示有冲突文件时,使用stash
命令可完美解决
3. 实践经验
- 多人开发时,每人均使用自己的分支。比如分支名可为
dev_zhangsan
- 设置主分支 (常见为
main
或master
) 为保护分支,个人提交代码只能先提交到远程个人分支,然后发起 merge request 合并请求 - 代码在 review 之后合并到主分支,合并后删除远程个人分支(本地个人分支不用删除)
- 个人分支在开发新功能时,先从主分支 pull 更新一次;保证本地分支最新,避免可能的代码冲突
- 个人分支在开发完成后推送到远程个人分支之前,再从主分支 pull 更新一次;如果有冲突则直接在本地进行解决,解决完之后再 push
4. 冲突的解决
- 代码冲突的出现,是在本地与远程仓库中对于同一文件各自存在差异(我有些代码你没有,你有些代码我没有)时发生
- 前期冲突避免:在代码开发开始前和完成后均 pull 一次远程代码到当前开发分支,可有效避免大部分冲突的发生
- 冲突发生:如果 pull 之后直接提示有冲突,此情况还分为两种:
- pull 成功,此时会提示冲突的文件,本地修改此文件(可通过搜索冲突分隔符
<<<<<<<
或=======
或>>>>>>>
快速定位冲突的地方),手动解决冲突 - pull 失败,此时需要先使用
git stash
命令隐藏本地改动,然后再次运行git pull
,接着运行git stash pop
恢复本地隐藏的改动,最后再手动解决冲突代码
- pull 成功,此时会提示冲突的文件,本地修改此文件(可通过搜索冲突分隔符
其它相关问题
git log 中文乱码
通过设置环境变量来解决:
bash
export LESSCHARSET=utf-8
centos7 升级 git
bash
yum remove git
yum install https://packages.endpointdev.com/rhel/7/os/x86_64/endpoint-repo.x86_64.rpm
yum install git
git --version # git version 2.43.0