【Git】语法速查



2017年02月10日    Author:Guofei

文章归类: 0x11_算法平台    文章编号: 103

版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/git.html


1. 安装git

step1:下载git
https://git-for-windows.github.io/
step1.5:安装,选项看着选
step2
选择use Git from the Windows Command Prompt
(自动加入Path,这样就可以在cmd里面用了)
step3
Configuring the line ending conversion:选择Checkout Windows-style,commit Unix-style line ending.

2. 初始设置

这部分的操作都在Git Bash下

2.1 设置信息

$git config --global user.name "Guofei"
$git config --global user.email "guofei9987@foxmail.com"
# 加上 --global 改的是 ~/.config 文件
# 不加 --global 改的是当前项目的 .git/config 文件

# 查看配置信息
git config --lis # 查看全局配置信息
git config --list # 查看当前项目的配置信息
# 解决中文乱码
git config --global core.quotepath false

2.2 设置SSH

step1 生成公钥和秘钥
(Git Bash下,而不是CMD下)

$ssh-keygen -t  rsa -C "guofei9987@foxmail.com"#生成秘钥

会提示输入密码(本地仓库的密码)

id_rsa文件是私有秘钥 id_rsa.pub文件是公开秘钥

step2 去官网导入公钥 去GitHub官网上,把github_rsa.pub文件中的内容添加到SSH中

会受到一个提醒邮件 现在可以用手中的私人秘钥与GitHub进行通讯了

查看公钥内容:

$cat ~/.ssh/id_rsa.pub

step3 看是否成功添加公钥

$ssh -T git@github.com # 测试是否成功

2.2.1 免输密码

git config credential.helper store

下次push要输入一次密码,之后都不用了

这条命令其实是在 .config 这个文件中增加下面两行

[credential]
helper=store

gitignore

文件 .gitignore 的格式规范如下:

  • 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配。
  • 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
# 这是注释
*.a  # 忽略所有以 .a 结尾的文件
/file.txt # 仅忽略根目录下的 file.txt 文件,path/file.txt 不会被忽略
path/ # 忽略 path/ 目录下的所有文件
path/*.txt # 忽略 path/*.txt,但不会忽略 path/path2/*.txt
!lib.a  # 叹号表示取反

clone/add/commit

git1

新建仓库

方法1: 在 GitHub.com 上新建仓库,然后 clone 下来

git clone git@github.com:guofei9987/hello-world.git

方法2: 在本地建仓库

mkdir git-dir
cd git-dir
git init

显示仓库状态

git status # 显示仓库状态

git log # 显示log
git log --pretty=short # 简略显示log
git log README.md # 显示文件的改动
git log -p README.md # -p 显示文件改动的详情

git log --graph # 显示图
git log --stat # 显示每次改动的行数
# git log 也可以定制显示的格式,用时查


git diff # 显示 modified 和 staged 之间的差别
git diff -p -2 # -p 显示文件改动的详情,-2 表示仅显示近2次
git diff --staged # 显示 staged 和 committed 的区别

git diff HEAD # 显示工作区和最新提交的差异

git diff <commit1> <commit2> # 比较指定的两个提交之间的差异

比较远程仓库和本地仓库的差异:
git fetch
git diff origin/main

回滚到远程分支的状态:
git reset origin/main

push

  • 新建的文件是untracked files
  • 执行add语句后,状态变为 to be committed

step1: add

git add filename
git add -A # 全部添加

step2: commit

git commit
# 在弹出的txt中填入这次commit的相关信息,格式约定:  
# 第一行:一句话概括更改的内容  
# 第二行:空  
# 第三行:记录更改的原因和详细内容  

# 不会弹出txt:
git commit -m "First commit"

step3 push
成功后,GitHub上的仓库就会被更新

git push
git push origin feature-A # 把feature-A这个分支push到GitHub

# 语法如下:
git push <远程主机名> <本地分支名>:<远程分支名>

git push origin master # 将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建

git push origin :master # 删除远程分支(推送空本地分支到远程分支),等同于 git push origin --delete master

撤销类操作

修改上次的 commit 信息

git commit --amend
# 会弹出上次 commit 填入的信息,可以做修改

把 staged 变回为 modified

git reset HEAD a.txt

把文件变成 untracked

# 文件的状态可以是 committed 或者 staged,效果是变成 untracked 状态,不改变文件内容
git rm --cached readme.txt
# 用于不小心把无关的文件 add 了,想取消,但又不想删除这些文件

把文件还原文件到上次 commit 的内容,会改变文件内容

git checkout -- a.txt

回溯历史版本

git reflog # 查看所有分支的 log,包括删除的

git reset --hard 75a8a671ec564e031eeec9fadbcd3a51daefe3c9

整个回到了历史版本了

4. 分支相关

4.1 查看分支

git branch # 列出本地的分支
git branch -r # 列出远端分支
git branch -a # 列出本地分支+远端分支
git branch -v # 查看各个分支最后一个提交对象的信息
git branch --merge # 查看已经合并到当前分支的分支
git branch --no-merge # 查看未合并到当前分支的分支

4.2 创建分支

git branch feature-A # 创建一个名为feature-A的分支
# (如果当前分支的修改没有 commit,也是基于这个没有 commit 的整个一套,虽然不推荐这么做)。

# 基于某个历史 commit 创建分支
git branch feature-A 885a30ee1a6f844a3b7895a2357a7d34fdfafac8

git checkout feature-A # 切换到feature-A分支
git checkout -b feature-A # 创建并切换到feature-A分支
git checkout -b feature-A dev # 基于dev新建feature分支

git clone -b branch_name git@github.com:guofei9987/guofei9987.github.io.git # -b 克隆指定的分支

4.3 删除分支

git branch -d test # 删除test分支,如果 test 分支还没有合并到其它分支,会删除失败
git branch -D test # 强制删除test分支
git push origin --delete develop # 删除远程分支

4.4 合并分支

git merge test # 把test分支合并到当前分支
git merge --no-ff feature-A

tag

# 列出所有tag
git tag
# 切换到某个tag
git checkout tag_name

远端

  • 添加到远程仓库
    git remote add origin git@github.com:guofei9987/git17.git # 这里的 origin 是远端的别名,多个远端对应不同的别名
    git remote rename origin orign1
    # 修改别名,把 origin 重命名为 origin1
    
  • 查看远端
    git remote -v # 查看已经指定的远端服务
    git remote show origin # 查看 origin 这个远端的详细信息,包括远端的 url、分支、push 缺省的分支
    
  • 删除远端
    git remote remove origin # 删除指定的远端
    
  • 推送到远程仓库
    git push -u origin local_master:master
    # -u 是 --set-upstream 的缩写,把这一次的参数设置为缺省值,下一次直接用 git push 即可
    # 冒号前后分别是 本地分支名:远端分支名
    # 如果远端不存在分支,则创建
    git push origin master
    # 等价于 git push origin master:master
    
  • 从远程仓库获取(在新文件夹下)
    git clone git@github.com:guofei9987/scikit-opt.git
    git clone -b master git@github.com:guofei9987/scikit-opt.git # 获取指定分支
    
  • 获取远端的分支(在本地已有的库中)
    git fetch # 把远端的最新数据拉过来
    git checkout -b local_branch origin/remote_branch # 基于 origin 远端的 remote_branch 分支,在本地创建一个叫做 local_branch 的分支
    
  • 删除远端分支
    git push origin :remote_branch
    # 可以理解为把一个空白的本地分支,推到远端 remote_branch 分支,其实就是删除远端分支
    
  • pull 从远程仓库取回代码
    git pull origin master
    

tag

git tag # 列出现有标签
git tag v0.1 # 新建标签
git tag -a v0.1 -m 'my conversion 1.2' # 新建带注释的标签

git checkout tagename # 切换到标签
git push origin v1.5 # 推送分支到源上
git push origin --tags # 一次性推送所有分支
git tag -d v0.1 # 删除标签
git push origin :refs/tags/v0.1 #删除远程标签

实用工具

在github上比较两个branch的不同

https://github.com/guofei9987/plans/compare/master...master1

在github上比较同一分支不同时间内的差别

https://github.com/guofei9987/plans/compare/master@{7.days.ago}...master

在github上比较指定日期之间的差别

https://github.com/guofei9987/plans/compare/master@{2017-01-24}...master@{2017-02-04}
  • github pages https://pages.github.com/
  • github jobs

比较图片的变动历史(与比较代码的变动历史操作一样)

Pull Request (PR)

如果想参与别人的项目

  1. 在github.com上fork到自己仓库
  2. clone到本地
  3. 建立一个branch
    git branch work
    git checkout work
    
  4. 编程工作
  5. push到自己的网站
    git add path/file_name.py
    git commit -m "填写你的说明"
    git push origin work
    
  6. 在github上发送PR

获取github.com上的新数据

git fetch
git pull

实用代码

参考链接

git log --after=2019-06-12 --before=2019-06-20 --no-merges --format='%an'
# 关于 format:
# %H 提交对象(commit)的完整哈希字串
# %h 提交对象的简短哈希字串
# %T 树对象(tree)的完整哈希字串
# %t 树对象的简短哈希字串
# %P 父对象(parent)的完整哈希字串
# %p 父对象的简短哈希字串
# %an 作者(author)的名字
# %ae 作者的电子邮件地址
# %ad 作者修订日期(可以用-date= 选项定制格式)
# %ar 作者修订日期,按多久以前的方式显示
# %cn 提交者(committer)的名字
# %ce 提交者的电子邮件地址
# %cd 提交日期
# %cr 提交日期,按多久以前的方式显示
# %s 提交说明
git log --after=2019-06-12 --before=2019-06-20 --pretty=tformat: --numstat
# 关于 tformat:
# --numstat 这段时间提交的,总增加的行数,删除的行数,文件路径
# --stat 这段时间,每次提交的,增删,文件路径
# --shortstat 每次提交的增、删

统计:

# 一段时间内的提交次数
git log --after=2019-06-12 --before=2019-06-20 --no-merges --format='%an'  | wc -l

# 一段时间内总的增删行数
git log --after=2019-06-12 --before=2019-06-20 --pretty=tformat: --numstat | awk '{ loc += $1 + $2 } END { printf "%s",loc }'

clone 指定 tag 的指定commit

git clone git@github.com:hankcs/HanLP.git -b v1.7.5 --depth=1
# -b 后面接 tag 名,--depth=1 指只克隆最新的版本,可以节省很多空间

清除历史记录

git checkout --orphan latest_branch # 切换到新的分支
git add -A # 缓存所有文件
git commit -am "commit message" # 提交跟踪过的文件
git branch -D master # 删除master分支
git branch -m master # 重命名当前分支为master
git push -f origin master # 提交到远程master分支

还有一个更狠的彻底抹除历史

rm -rf .git
git init
git remote add origin https://github.com/guofei9987/tmp
git add -A
git commit -m 'remove history'
git push -f origin master

指定 commit 时间

GIT_AUTHOR_DATE=2020-11-28T12:00:00 GIT_COMMITTER_DATE=2020-11-28T12:00:00 git commit --allow-empty -m "update"

环境变量

  • Git装好后有个cmd路径,找到这个路径,复制这个路径
    (例如\GitHubDesktop\app-0.8.0\resources\app\git\cmd)
  • 按下win键,输入”环境变量”。
    点击环境变量,选中Path,按编辑键
    上一步复制的路径,加到Windows的path环境变量下
  • 正常使用

一台电脑绑很多ssh

https://www.cnblogs.com/jikexianfeng/p/5873698.html


您的支持将鼓励我继续创作!