Git总结
基本操作
有三种文件存储的地方:本地文件夹、本地暂存区、远程仓库
本地操作
初始化
git init
初始化本地文件夹,会创建一个.git子目录,暂存区等各种信息都在里面git clone <url>
把远程url对应的仓库克隆到本地,里面也有一个.git子目录
文件更新
git add <filename>
开始跟踪文件(并添加到暂存区),或者暂存文件的更新(如果之前已经跟踪了文件,而且文件发生了变化)git commit
提交暂存区的内容(仍然在本地),会调用文本编辑器开始编辑说明文字-m
可以在命令后面直接接上一行说明文字-amend
替换上次的提交的注释文字
git reset --hard HEAD^
回退commit--hard
会撤销commit、撤销add、恢复代码--soft
只撤销commit--mixed
撤销commit、撤销add
可以先
git add . && git commit -m tmp
生成临时提交,之后再完全退回到上次提交
分支管理
一次commit对应有一个commit对象,其中有父对象的指针,所有commit连起来形成类似于树的结构。
分支就可以认为是指向某个commit对象的指针,HEAD
也是一个指针,指向当前的commit对象
git branch
查看分支- 后面指定分支名则是创建分支
-d
删除分支-v
显示分支对应的最后一次提交--merged
显示合并到当前分支的(这些分支其实可以删掉),再加一个分支名则查看合并到指定分支的分支
git checkout <分支名>
切换到指定分支(移动HEAD
指针)-b
创建并切换
git checkout <commitId>
切换到指定的commitgit merge <分支名>
把当前分支与指定分支合如果不是一条线直连的,可能要手动解决冲突,然后会建立一个新的commit(用到公共祖先)
git rebase <分支名>
把当前分支摘下,嫁接到指定分支git rebase -i <要合并的几个commit的前一个commit_sha>
:弹出编辑器提示要pick
保留的commit(从旧到新排),把不需要保留的commit前面的pick
改为s
,关掉后又会弹出编辑新的commit信息。如果是合并已经push的commti,需要先pull,然后弹窗提示编辑说明merge的理由,再push并不会删掉commit,反而多了一个merge操作。
远程操作
git remote
查看远程仓库-v
选项显示具体url,clone来的仓库默认名为origin
-add <shorname> <url>
选项添加远程链接rename
和remove
改名和移除
git fetch <shortname or url>
抓取数据(不合并)git pull
自动抓取并且合并git push
推送到上游(要先抓取、合并,保证没有冲突)
零散
git status
查看文件状态,Changes to be comitted
就是已经暂存的,not staged
是还没有暂存的-s
或--short
简短显示:M
修改了,A
添加跟踪,??
未跟踪,MM
修改后暂存又修改
git diff
查看未暂存文件的改动--staged
或--cached
查看已暂存的改动(相对于最后一次提交)
git log
查看提交记录-p
或--patch
显示修改的文件-2
只显示2条
修改
.gitignore
后生效git rm -r --cached .
清除缓存然后重新提交
.gitignore规则
默认可以是任意中间目录,**/
表示任意目录下,/
开头表示根目录下。/
结尾表示文件夹,/*
结尾表示忽略目录下所有内容,而不包括目录本身,使用!
强制保留时需要这个*
1 | /bin/* # 注意结尾要用* |
更多
参考progit
添加SSH Key
打开任意文件夹,右键空白处git bash here
ssh-keygen -t rsa -C "邮箱地址"
,回车根据提示设置保存文件名,默认是
~/.ssh/id_rsa
。如果是多个账号,一定要指定其它文件名或路径。之后一路回车
到浏览器中登录github,在
Settings
里找到SSH and GPG keys
一栏,点击New SSH Key
。复制上一步生成的id_rsa.pub
(跟id_rsa
同路径)里的内容粘进去
多账号配置
打开文件夹,右键空白处git bash here
,直接git clone git@github.com:xxxxx/xxx.git
,可能会报错:
1 | ERROR: Repository not found. |
因为这个私有仓库的所有者跟全局配置的不一样,自然就不允许下载,需要进行一些设置
配置连接远程仓库使用的SSH Key
如果已经使用方法一clone了仓库,可以进入找到仓库里.git/config
文件,按方法二修改其中的url
字段就可以了
设置本地仓库的个人信息
cd xxx
进入仓库文件夹
git config --local user.name xxxx
设置提交者用户名
git config --local user.email xxxx@xx.com
设置提交者邮箱
git config --local --list
检查设置
提交PR
fork源仓库
打开浏览器,进入源仓库,点击fork,选择自己的账号,然后会跳转到fork后的仓库页面
clone到本地
复制fork后的仓库链接,打开文件夹,右键空白处git bash here
按照上面多账号配置的步骤,依次执行
1 | ssh-agent bash |
然后git clone git@github.com:xxxxx/xxx.git
,cd
进去,然后进行一些设置
1 | git config --local user.name xxxxx |
添加源仓库链接
git remote -v
看到的是自己fork来的仓库地址,名字为origin
git remote add upstream git@github.com:xxxxx/xxx.git
添加源仓库的地址,并命名为upstream
推送到fork后的仓库
修改文件后,执行
1 | git add . |
创建pull request
打开浏览器,查看自己fork来的仓库,会看到仓库上会有提示
1 | This branch is 1 commit ahead of xxxxx:xxx |
旁边有个下拉选项Contribute
,可以选择Open pull request
还有个下拉选项是Fetch upstream
,如下显示说明已经跟上游同步了
1 | This branch is not behind the upstream xxxx:xxx. |
选择Open pull request
,进去后点击Create pull request
写点东西,然后再点Create pull request
,等待仓库管理员合并
合并PR
打开浏览器仓库页面,点击Pull requests
一栏,点进别人的PR。写点东西交流下,没问题就点击Merge pull request
,按钮旁边也有说明如何用命令行来合并