Git—GitHub常用操作记录

本文以一次完整的实际操作需求记录Git命令,在此之前需要配置好Git工具和注册GitHub账号

Git基本命令

Git基本命令

Git概念图

更新fork的远程仓库

假设:
① forked from 仓库地址:git@github.com:company/project.git
② 自己 fork 的仓库:git@github.com:username/project.git

  1. 添加远程仓库到本地并设定名为 upstream
    git remote add upstream git@github.com:company/project.git

  2. 显示本地的远程仓库地址
    git remote -v
    添加成功的话,将会看到如下类似信息:

    1
    2
    3
    4
    origin  git@github.com:username/project.git (fetch)
    origin git@github.com:username/project.git (push)
    upstream git@github.com:company/project.git (fetch)
    upstream git@github.com:company/project.git (push)
  3. fetch 远程分支
    git fetch upstream
    fetch成功的话,将会看到如下类似信息:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    remote: Enumerating objects: 76, done.
    remote: Counting objects: 100% (76/76), done.
    remote: Compressing objects: 100% (4/4), done.
    remote: Total 166 (delta 72), reused 74 (delta 72), pack-reused 90
    Receiving objects: 100% (166/166), 26.84 KiB | 37.00 KiB/s, done.
    Resolving deltas: 100% (75/75), completed with 43 local objects.
    From git@github.com:company/project.git
    9410674..abb35b6 master -> upstream/master
    0130b86..481332e release-1.8 -> upstream/release-1.8
    0d988d6..2d9c4e7 release-1.9 -> upstream/release-1.9
  4. 合并 fetch 的分支到本地 master
    git merge upstream/master
    合并成功的话,将会看到类似的下方信息:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Updating 9410674..abb35b6
    Fast-forward
    docs/dev/table/catalog.zh.md | 366 ---------------------
    docs/dev/table/hive/index.md | 16 +-
    docs/dev/table/hive/index.zh.md | 14 +-
    docs/dev/table/sqlClient.md | 2 +-
    docs/dev/table/sqlClient.zh.md | 2 +-
    .../test-scripts/kafka-common.sh | 2 +-
    .../test_high_parallelism_iterations.sh | 26 +-
    .../runtime/taskmanager/TaskAsyncCallTest.java | 14 +-
    .../functions/sql/FlinkSqlOperatorTable.java | 11 +
    .../planner/codegen/calls/StringCallGen.scala | 2 +-
    .../planner/expressions/ScalarFunctionsTest.scala | 2 +-
    .../planner/expressions/SqlExpressionTest.scala | 4 +
    12 files changed, 53 insertions(+), 408 deletions(-)
    delete mode 100644 docs/dev/table/catalog.zh.md
  5. 查看log更新记录
    git log
    将会看到类似的下方信息:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    commit 0e2eac4a39e1e543d8d79e607be117207b3fcfdb (HEAD -> master, upstream/master, origin/master, origin/HEAD)
    Author: Stephane Nicoll <snicoll@pivotal.io>
    Date: Sun Aug 25 05:08:17 2019 +0200

    Upgrade Java 13 version in CI image

    See gh-17839

    commit 7d994e607d33f9b53c9d7f6d3ee71b77ed7b4dfb
    Author: Stephane Nicoll <snicoll@pivotal.io>
    Date: Sat Aug 24 08:22:28 2019 +0200

    Restructure tests to exercise deprecated property in a dedicated test
  6. 推送本地 master 分支到自己fork的仓库
    git push origin master

  7. 去自己 GitHub 的 project 库中核对更新内容

    merge 失败,解决冲突

    1
    2
    3
    # 1. 查看当前状态
    $ git st
    # 2. 借助可视化工具,比如IDEA中的Git工具,项目右键Git -> Resolve Conflicts,接着在可视化窗口选择操作接收哪部分修改

修改 remote 仓库

1
2
3
4
5
6
7
8
# 1. 重设 remote 地址
$ git remote set-url origin git@github.com:username/project.git

# 2. 将本地分支 master 与 remote 的 master 分支关联起来,有下面两种方式
# ① 设置 set-upstream
$ git branch --set-upstream-to=origin/master master
# ② 从本地强 push 到 remote(慎用,可能导致远端代码丢失)
$ git push -f origin master

项目太大导致克隆失败

在克隆一个项目到本地时,出现下方错误提示
error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received.
fatal: the remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

这时应考虑在第一次克隆的时候,把克隆深度设置为1,然后再fetch,操作如下:

  1. 设置克隆深度为1
    git clone https://github.com/username/project.git --depth 1

  2. 进入项目再fetch

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ cd project
    $ git fetch --unshallow

    # 2.1 如果下载时还是失败,可考虑将 git 配置中的 postBuffer增大一些,下载完毕后记得改回来即可,具体命令如下:
    $ vim ~/.gitconfig

    ## 在文件末尾添加下方内容
    [http]
    postBuffer = 500m
    [https]
    postBuffer = 500m

撤销命令 git reset

Git ~ 和 ^ 的区别

Git ~和^的区别

参数说明

  • –soft
    不会改变暂存区和工作区的文件,只是将 head 指针指向后面指定的 commit 处。同时将离开你待提交的更改文件,用git status可以查看;


  • –mixed
    这是默认省略选项,重置暂存区文件,不改变工作区文件(比如已经保存的文件,但未被标记为待提交状态),同时会提示哪些文件还未被更新。
    如果选中中指定了 -N ,那么被移除的文件将被标记为 intent-to-add;


  • –hard
    重置暂存区和工作区文件,自上一阶段 commit 以来对工作树中跟踪文件的任何更改都将被丢弃掉。

撤销本地的 add操作

1
git reset HEAD

撤回本地的 commit

1
2
3
4
# 撤回本地上一次commit
git reset HEAD~
# 撤回到倒数第n次commit前
git reset HEAD~n

git status 中文文件名正常显示

1
2
3
# 未进行设置时,中文文件名会以8进制的字符编码显示
# 这样就可以直接显示中文名了
git config --global core.quotepath false

修改上一次 commit 注释

未 push 到远端

1
2
3
4
5
6
$ git commit --amend
# 进入包含 commit 内容的界面编辑
## 更新第一行内容
## 依次按下 ctrl+x,shift+y,enter,即保存退出
$ 查看 git 日志确认更改完成
$ git log

已 push 到远端

1
2
3
4
# 确保push的时候,已经获取到最新内容
$ git pull
# push 到远端
$ git push

未添加 .gitignore 时

1
2
3
4
5
6
7
8
9
10
# 首先进入当前工作目录
$ cd workdirectory
# 清空暂存区
$ git rm -rf --cached ./
# 添加上 .gitignore 文件
## 文件中写需要被忽略的文件名/类型
# 添加文件到暂存区
$ git add .
# 查看此次添加到暂存区的文件
$ git ls-files

删除远端分支

1
2
# 需要注意不支持当前工作分支
$ git push origin --delete branch

分支的创建和删除

1
2
3
4
5
6
7
8
9
# 创建
$ git branch newbranch
## 切换到新分支
$ git checkout newbranch
## 创建并切换到新分支,是上方两条命令的简写
$ git checkout -b newbranch

# 删除
$ git branch -d newbranch

删除远程分支并清理本地记录

1
2
3
4
5
6
7
8
# 删除远程分支
git push origin --delete <BranchName>

# 查看当前本地分支与远程分支的对应关系
git remote show origin

# 删除本地未与远程关联的分支
git remote prune origin
码哥 wechat
欢迎关注个人订阅号:「码上行动GO」