Skip to content

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
  • 设置主分支 (常见为 mainmaster) 为保护分支,个人提交代码只能先提交到远程个人分支,然后发起 merge request 合并请求
  • 代码在 review 之后合并到主分支,合并后删除远程个人分支(本地个人分支不用删除)
  • 个人分支在开发新功能时,先从主分支 pull 更新一次;保证本地分支最新,避免可能的代码冲突
  • 个人分支在开发完成后推送到远程个人分支之前,再从主分支 pull 更新一次;如果有冲突则直接在本地进行解决,解决完之后再 push

4. 冲突的解决

  • 代码冲突的出现,是在本地与远程仓库中对于同一文件各自存在差异(我有些代码你没有,你有些代码我没有)时发生
  • 前期冲突避免:在代码开发开始前和完成后均 pull 一次远程代码到当前开发分支,可有效避免大部分冲突的发生
  • 冲突发生:如果 pull 之后直接提示有冲突,此情况还分为两种:
    1. pull 成功,此时会提示冲突的文件,本地修改此文件(可通过搜索冲突分隔符 <<<<<<<=======>>>>>>> 快速定位冲突的地方),手动解决冲突
    2. pull 失败,此时需要先使用 git stash 命令隐藏本地改动,然后再次运行 git pull,接着运行 git stash pop 恢复本地隐藏的改动,最后再手动解决冲突代码

其它相关问题

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