再看git

前言

犹如做手工大多都要用到尺子区度量一样,git也是大多it从业者的必须工具;当然哪怕你不是这个行业的,你也可以用它来做点儿别的,比如仅画一条直线、记录一段文字、存放一个图片。
你可以只用三板斧 git add xx,git commit xx,git push xx,遇到难题大不了删除本地文件,然后重新下载一份;但是你也可以把它玩出花儿来。或者感兴趣的研究一些本后的原理,处理一些复杂的使用场景。最终能达到你的目的即可,且高效一点儿,慢慢来、慢慢学~

每个人的使用习惯和遇到的场景不太一样,只能尽量地讲讲命令的使用,绝对不会覆盖到所有使用场景。况且,条条大道通罗马,git命令也是一样,选择你偏好的就可以了。

主要参考资料如下

1. Git特色

  • 近乎所有操作都是本地执行
  • 直接记录快照,而非差异比较
  • Git 保证完整性

Git 中所有的数据在存储前都计算校验和,然后以校验和来引用。 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。 这个功能建构在 Git 底层,是构成 Git 哲学不可或缺的部分。 若你在传送过程中丢失信息或损坏文件,Git 就能发现。
Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来。

2. 不同状态

git项目的三个阶段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
+-----------------+       +-----------------+       +-----------------+
| 工 作 区 | | 暂 存 区 | | .git目 录 |
+--------+--------+ +--------+--------+ +---------+-------+
| | |
| | |
| checkout repo |
| <--------------------+------------------------+ |
| | |
| git add | |
| +--------------------> | |
| | |
| | git commit |
| +-----------------------> |
| | |
| | |
+ + +

文件可能处于其中之一: 已修改(modified)、 已暂存(staged)、已提交(committed)

  • 已修改表示修改了文件,但还没保存到数据库中。
  • 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
  • 已提交表示数据已经安全地保存在本地数据库中。

3. 配置

Git 自带一个 git config 的工具来帮助设置控制用户信息、外观、行为等的配置变量。 这些变量存储在三个不同的位置:

  • 1.系统级
    /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果在执行 git config 时带上 –system 选项,那么它就会读写该文件中的配置变量。 (由于它是系统配置文件,因此你需要管理员或超级用户权限来修改它。)
    命令:git config --system -l

    mac OS下 似乎默认没有这个文件 /etc/gitconfig

  • 2.(用户)全局级
    ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 你可以传递 –global 选项让 Git 读写此文件,这会对你系统上 所有 的仓库生效。
    命令如:git config --global -l
  • 3.仓库级
    当前使用仓库的 Git 目录中的 config 文件(即 .git/config):针对该仓库。 你可以传递 –local 选项让 Git 强制读写此文件,虽然默认情况下用的就是它。。 (当然,你需要进入某个 Git 仓库中才能让该选项生效。)
    git config --local -l

每一个级别会覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量,即(用户)全局级 > 系统级

检查配置信息

如果想要检查你的配置,可以使用 git config --list 命令来列出所有 Git 当时能找到的配置。

1
2
3
4
5
6
7
8
$ git config --list
user.name=John Doe
user.email=johndoe@example.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...

你可能会看到重复的变量名,因为 Git 会从不同的文件中读取同一个配置(例如:/etc/gitconfig 与 ~/.gitconfig)。 这种情况下,Git 会使用它找到的每一个变量的最后一个配置

你可以通过输入 git config <key> 来检查 Git 的某一项配置

4. 常用命令

参考 https://zhuanlan.zhihu.com/p/107324618 。下面是按照子命令讲解,但如果按照场景讲解可能会更匹配日常使用。

  • git clone/fetch/checkout

    1
    git clone <url> #克隆现有的仓库
  • git branch

    1
    2
    3
    4
    5
    6
    git branch  # 显示当前分支
    git branch -a # 查看本地分支、远程所有分支
    git branch branchName # 新建分支
    git branch -m branchOld branchNew # 修改分支名称,从 branchOld 改为 branchNew
    git push origin --delete dev2 # 删除分支名 dev2 的远程分支,居然一行命令就搞定了
    git branch <branchName> <start point>
  • git checkout

    1
    2
    3
    4
    5
    6
    7

    git checkout branchName #命令会将当前工作分支切换到branchName
    git checkout -b newBranch #从当前分支copy一份到新分支,并切换到新分支下,等同于2步:1-git branch newBranch-git checkout newBranch
    # 加入-B可选参数后会强制创建新分支,并且会覆盖原来存在的同名分支。
    git checkout -- CONTRIBUTING.md #撤消对文件的修改。如果你并不想保留对 CONTRIBUTING.md 文件的修改怎么办?用这个命令
    # 取消暂存的文件
    git reset HEAD <file>

请务必记得 git checkout – 是一个危险的命令。 你对那个文件在本地的任何修改都会消失——Git 会用最近提交的版本覆盖掉它。 除非你确实清楚不想要对那个文件的本地修改了,否则请不要使用这个命令。

  • git status

    1
    2
    3
    #查看文件状态
    git status #标准输出
    git status -s(或--short) # 简洁输出;新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。
  • git add

    1
    2
    3
    #跟踪(track)新文件,或者说将 文件从 工作区加入到暂存区;在add之前,可以status查看到新文件是 Untracked files
    git add filename #添加指定文件
    git add *.c #添加匹配结果指定的文件
  • git diff

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #diff 比较,命令可以不指定 <filename>,则对全部文件操作
    git diff --staged # 暂存取 vs .git目录/仓库
    git diff --cached <filename> #暂存区 vs Git仓库, --staged 和 --cached 是同义词

    git diff <commit> <filename> #工作目录 vs Git仓库
    git diff <commit> <commit> #Git仓库 vs Git仓库

    git diff branch1 branch2 --stat //显示2个分支所有有差异的文件列表
    git diff branch1 branch2 //显示2个分支所有有差异的文件的详细差异
    git diff branch1 branch2 file_path //显示2个分支指定文件的详细差异
  • git rm

    1
    2
    git rm -f file-path #从跟踪文件列表中清除,并从磁盘上删除文件
    git rm --cached file-path #从跟踪文件列表中清除,仍然将源文件保存在磁盘上
  • git mv

    1
    2
    3
    4
    5
    6
    git mv README.md README

    #运行 git mv 就相当于运行了下面三条命令:
    mv README.md README
    git rm README.md
    git add README
  • git commit

    1
    2
    3
    4
    5
    6
    7
    8
    git commit -m “desc”  # 正常提交
    git commit -a -m “desc” #??
    # -a, --all
    # Tell the command to automatically stage files that have been modified and
    # deleted, but new files you have not told Git about are not affected.

    git commit --amend #有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令来重新提交,这是有交互的
    git commit –amend -m “desc” #追加提交,这是没有交互的
  • git remote
    参见 远程仓库的使用

如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch 命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。

1
2
3
4
5
git remote #它会列出你指定的每一个远程服务器的简写。 常见输出:origin
git remote -v #显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。
git remote add <shortname> <url> #添加一个新的远程 Git 仓库,同时指定一个方便使用的简写:
git fetch <remote> #该命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
git remote show <remote> #如果想要查看某一个远程仓库的更多信息,可以使用,例如 git remote show origin
  • git push

    1
    git push origin test:test  # 提交本地test分支 作为远程的test分支
  • git merge

    • [] todo
      (在本地merge分支xx 到master,然后push)
  • git log

    1
    2
    3
    4
    5
    6
    git log <dev> #查看分支 dev 的提交历史记录,默认是时间倒序,最近的提交排在最上面),不写分支名查看当前分支的提交历史记录
    git log --reverse #时间正序显示提交历史记录
    git log --oneline # 一行显示提交历史记录
    git log --graph #图示法显示提交历史
    git log --reverse --oneline --graph #时间正序 + 一行显示 + 图示法显示
    git log -n #显示最近的 n 个提交
  • [] origin 是什么 git 的 origin 的含义 cnblogs.com/xuyaowen/p/git-origin.html

  • [] 追踪关系 –track
  • [] upstream ??

其他:
HEAD 最近一次 commit
HEAD^ 上次提交
HEAD~100 上100次提交

git revert

英文来定义一下 fetch 和 pull 更为明白:

git fetch is the command that says “bring my local copy of the remote repository up to date.”
git pull says “bring the changes in the remote repository where I keep my own code.”

5. 一些场景

  • 建立个人镜像的仓库 mirror
  • 清除github上某个文件的历史版本
  • 命令行提pull request

Pull Request (PR) is a Github feature that allows users to collaborate better together.

hub这个工具可以,以下针对github.com做的测试,如果是对于企业内部的github可能需要区别对待,或测试是否有效。另外,运行 git request-pull master ./这样的命令,只会做pr的内容比较,实际上是不出提交一个pr的

1
2
3
4
➜  api-test-demo git:(test-pr) ✗ hub pull-request  #会出现交互,提示输入 pr 的 comment

#上面完成后,最后输出
https://github.com/cicd-draft/api-test-demo/pull/1

提第一次安装、使用时,提示输入 github.com username,github.com password。参考链接: https://hackernoon.com/how-to-git-pr-from-the-command-line-a5b204a57abhttps://hub.github.com/

  • cherry-pick
    cached 是什么状态

本地和远程的关系,还要把新分支推到远程也就是在远程建立一样的一个分支。所以我们在本地和远程建立分支后还要把他们关联起来,这样才有意义!!!


More Ref:

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2019-2024 John Doe
  • Visitors: | Views:

请我喝杯咖啡吧~