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
新建仓库
方法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)
如果想参与别人的项目
- 在github.com上fork到自己仓库
- clone到本地
- 建立一个branch
git branch work git checkout work
- 编程工作
- push到自己的网站
git add path/file_name.py git commit -m "填写你的说明" git push origin work
- 在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