Usage of git
Git 配置
Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。
这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:
- /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
- ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
- 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
用户信息
创建一个 SSH key
$ ssh-keygen -t rsa -C "your_email@example.com"
代码参数含义:
-t 指定密钥类型,默认是 rsa ,可以省略。
-C 设置注释文字,比如邮箱。
-f 指定密钥文件存储文件名。
以上代码省略了 -f 参数,因此,运行上面那条命令后会让你输入一个文件名,用于保存刚才生成的 SSH key 代码,
当然,你也可以不输入文件名,使用默认文件名(推荐),那么就会生成 id_rsa 和 id_rsa.pub 两个秘钥文件。
接着又会提示你输入两次密码(该密码是你push文件的时候要输入的密码,而不是github管理者的密码),
当然,你也可以不输入密码,直接按回车。那么push的时候就不需要输入密码,直接提交到github上了.
添加你的 SSH key 到 github上面去
a、首先你需要拷贝 id_rsa.pub 文件的内容,你可以用编辑器打开文件复制,也可以用git命令复制该文件的内容,如:
`$ clip < ~/.ssh/id_rsa.pub``
b、登录你的github账号,从又上角的设置( Account Settings )进入,然后点击菜单栏的 SSH key 进入页面添加 SSH key。
c、点击 Add SSH key 按钮添加一个 SSH key 。把你复制的 SSH key 代码粘贴到 key 所对应的输入框中,记得 SSH key 代码的前后不要留有空格或者回车。当然,上面的 Title 所对应的输入框你也可以输入一个该 SSH key 显示在 github 上的一个别名。默认的会使用你的邮件名称。
如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。
如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。
git clone
我们使用 git clone 从现有 Git 仓库中拷贝项目(类似 svn checkout)。
克隆仓库的命令格式为:
git clone <repo>
git clone <repo> <directory>
参数说明:
repo:Git 仓库。
directory:本地目录。
-b 指定分支
比如,要克隆 ims0 代码仓库 root,可以用下面的命令:
git clone -b master git://github.com/ims0/root.git
执行该命令后,会在当前目录下创建一个名为root的目录,其中包含一个 .git 的目录,用于保存下载下来的所有版本记录。
如果要自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字.
指定clone 的深度,或者时间, 来减少拉取无用的log
深度用 --depth
git clone 中加入参数 --depth=1,只拉取最近的一个 revision。
git clone --depth=1 https://github.com/torvalds/linux.git
指定log开始时间用 --shallow-since
git clone git://github.com/ims0/root.git --shallow-since "2017-10-22"
git clone git://github.com/ims0/root.git --shallow-since "2017-10-22 00:00:00"
git clone git://github.com/ims0/root.git --shallow-since="Mon Oct 23 13:38:21 2017 +0800"
git clone git://github.com/ims0/root.git --shallow-since="Oct 23 00:00 2017"
撤销操作
从暂存区恢复文件
用暂存区的文件覆盖工作区对某个文件的修改: git checkout -- readme.md
这种情况用于readme.md 添加到暂存区后,又做了一些错误的修改,想恢复到暂存区的状态
无论readme.md 是否提交到仓库,都是以暂存区为模板来恢复。
从仓库恢复某个文件
加入一个工作区/暂存区/仓库都不一样,想要工作区恢复到和仓库一样
1,使用git reset HEAD
2,使用git checkout --
版本退回
1,仓库版本覆盖整个工作区 git reset --hard HEAD
2,前一个仓库版本覆盖整个工作区 git reset --hard HEAD^
3,前两个仓库版本覆盖整个工作区 git reset --hard HEAD^^
4,前n个仓库版本覆盖整个工作区 git reset --hard HEAD~n
5,根据版本号回退 git reset --hard 版本号,(使用 git reflog 查看版本号)
版本前进
1, 打印log: git reflog
2, 根据id 前进到指定版本: git reset --hard commit_id
git branch
- 查看分支:git branch
- 查看本地分支与远程分支的映射: git branch -vv
- 本地分支关联到远程分支:
git branch --set-upstream-to=origin/name
- 创建分支:git branch name
- 切换分支:git checkout name
- 创建+切换分支:git checkout –b name
- 合并某分支到当前分支:git merge name
- 删除分支:git branch –d name
git clean
git clean -f
git clean -fd
# 连 .gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
git clean -xfd
# 在用上述 git clean 前,墙裂建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删
git clean -nxfd
git clean -nf
git clean -nfd
#查看ignore 文件
git clean -Xn
#删除ignore 文件
git clean -Xdf
git 补丁的应用
https://git-scm.com/docs/git-format-patch
创建patch 和diff
- 某次提交以后的所有patch:
git format-patch [commit id]
- 某次提交之前的 n 次提交,包括当前 id 一共 n 个提交
`git format-patch [commit id] -n提交`
某单次提交
git format-patch [commit id] -1
最近一次提交
git format-patch HEAD^
制作相对路径的补丁
git format-patch --relative 065e252058 services/orin
git format-patch HEAD^ --relative services/orin
应用patch
git apply --reject patch
暂存特定修改的文件
git stash -- filename.ext
git push
git push origin HEAD:refs/for/master
把本地内容推送到远程,并在远程创建与本地的同名分支:
git push origin branch-name
强制推送,用于 --amend修改后
git push origin branch-name -f
git切换到tag
使用以下命令就可以取得对应tag的代码:
git checkout tag_name
此时git可能会提示你当前处于“detached HEAD” 状态。因为tag相当于一个快照,不能修改它的代码。需要在tag代码基础上做修改,并创建一个分支:
git checkout -b branch_name tag_name
上面命令的意思切换到指定的tag(tag_name),并创建一个分支,本地重新命名(branch_name)。
以SpringBoot的版本为例:
git checkout -b tag-2.2.1.RELEASE v2.2.1.RELEASE
修改远程分支
比如github走加速
git remote set-url origin https://github.com.cnpmjs.org/
github 免密push
ssh-keygen 公钥生成
git config --global credential.helper store # git push的时候记住用户名和密码
git config --global push.default simple
————————————————
使用github_token访问
- clone时使用token
git clone https://scuzzlebuzzle:@github.com/scuzzlebuzzle/ol3-1.git --branch=gh-pages gh-pages - 修改已有repo为token认证
git remote set-url origin https://username:${github_token}@github.com/username/repo.git
github push 认证失败
1.现象:让输入账号/密码
解决方式: https 改为 git
git remote set-url origin git@github.com:USERNAME/REPONAME.git
https://stackoverflow.com/questions/18935539/authenticate-with-github-using-a-token
将别人的项目代码fork到自己的远程仓库时,和别人的代码就没有关联了,当需要更新别人的代码时就需要建立关联。
修改历史commit
- 最近 3 条commit
$ git rebase -i HEAD~3
- 在编译器里把需要修改的commit前的pick 改为e,然后save,exit
- 在work dir完成修改
- 把修复内容合入当前commit:
git commit --amend
- 调到下一个需要修改的commit:
git rebase --continue