本文参考Git中文手册绘制的思维导图,如有不正之处,欢迎留言指正。
git
基础
特性
- 直接记录快照,而非差异比较
- 多数操作仅添加操作
- 近乎所有操作都是本地执行
- 时刻保持数据完整性
工作流程
-
在工作目录(workspace)中修改某些文件
- modified
-
用add命令对修改后的文件进行快照,然后保存到暂存(index)区域
- staged
-
提交更新(commit),将保存在暂存区域的文件快照永久转储到 Git 目录中,指向HEAD(最后一次提交的结果/local repository)
- committed
安装完git后的配置
设置git 的username 和mail
-
git config --global user.name “XXX”
-
git config --global user.email "[email protected]"
生成ssh**
-
查看是否有**
- cd ~/.ssh,若没有则会报无此文件或文件夹,有的话直接复制公钥(id_rsa.pub);没有的话新生成一个
-
生成**
- ssh-****** -t rsa -C "[email protected]",一路回车
-
复制公钥(id_rsa.pub)
-
把公钥添加到gitlab
- 登录gitlab,在settings里搜SSH Keys,新建一个并把它复制到key
-
测试是否成功
- windows下直接右键点"git bash here",输入" ssh -T [email protected]",在警告代码输入yes,能显示"Welcome to GitLab",OK。
简单使用
取得项目的 Git 仓库
-
在工作目录中初始化新仓库
- git init
-
从现有仓库clone
-
git clone [email protected]:/path/to/repository
-
本质
- 自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)
-
快照
-
workspace的文件状态
-
tracked
-
被纳入版本控制管理的文件,在上次快照中有它们的记录
-
类型
-
unmodified
- 白,已commit
-
modified
- 蓝,未add
-
staged
- 绿, 已add,未commit
-
-
初次clone某个仓库时,工作目录中的所有文件都属于tracked文件,且状态为unmodified。
-
-
untracked(红,未add)
- 没有snapshot也不在index,一般为新建文件
-
-
添加需要追踪的新文件和待提交的更改
- add
-
查看有何改动
-
status
- 查看上次提交之后被修改的文件
-
diff
-
查看具体修改了什么内容
- git diff [version]
-
-
-
将快照记录下来/将改动提交到local repository
-
commit
-
生成commit-id
- 每次commit命令都会在local repository生成一个40位的哈希值
-
-
撤销
-
git reset
-
从local repository回滚到index,直接删除指定的commit
-
若上次commit有问题,想修改
-
git reset HEAD^
- 回到前一版本,保留工作空间的修改
-
-
git reset -soft
- 把changes 直接加到staging area(暂存区)
-
git reset -hard
-
不留staging area 也不留working tree(完全删除任何修改记录),放弃所有更改
- 可用于merge发生冲突,想放弃
-
-
-
git revert
- 用一次新的commit来回滚之前的commit
-
git checkout
-
从index复制到workspace
-
git checkout HEAD
- 从local repository复制到workspace
-
-
-
将文件从缓存区移除
- git rm
标签
-
给当前版本做个标记以便回退到该版本,就不用记冗长的sha1码,记那个tag标签就好
-
列显已有的标签/查看版本
-
git tag
-
筛选出1.4.2系列的
- git tag -l ‘v1.4.2.*’
-
-
新建
-
轻量级(lightweight)
-
指向特定提交对象的引用,只是临时性加注标签,或者不需要旁注额外信息,可以用它
-
什么选项都不用写
- git tag v1.4-lw
-
-
含附注(annotated)
-
存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用GNU Privacy Guard (GPG)来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息
-
-a(取annotated的首字母)
-
例: git tag -a v1.4 -m ‘my version 1.4’
-
-m
- 指定了对应的标签注释
- 若没有给出,git会让你输入
-
-
-
-
-
查看相应标签的版本信息,查看某一次提交更新了什么
- git show v1.4
-
分享标签
-
默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库
- git push origin [tagname]
- 例:git push origin v1.5
-
一次推送所有本地新增的标签
- git push origin --tags
-
日志
-
了解本地仓库的历史记录
-
git log
-
更详细的
-
git log --author=name
- 某一个人的提交记录
-
git log --pretty=oneline
- 压缩后的每一条提交记录只占一行的输出
-
git log --graph --oneline --decorate --all
- 用ASCII 的树形结构来展示所有的分支, 每个分支都标示了它的名字和标签
-
git log --name-status
- 查看哪些文件改变了
-
-
-
分支
创建仓库的时候,master 是“默认的”分支,把它push到remote repository其它人才能访问到
查看分支
-
查看本地分支
- git branch
-
查看远程分支
- git branch -r
-
查看所有的分支
- git branch -a
创建本地分支
-
git branch name
- 新分支创建后不会自动切换为当前分支
新建并切换到该分支
-
git checkout -b new_branch
-
相当于执行下面两条命令
- git branch new_branch
- git checkout new_branch
-
删除分支
-
git branch -d new_branch
- 只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的
- 想强制删除一个分支,可以使用-D选项
更新与合并
-
pull=fetch(获取) + merge(合并)
-
git merge name
- 把name这个分支和当前所处分支合并
远程仓库的使用
查看当前的远程库
-
git remote
- 列出每个远程库的简短名字,默认origin
-
git remote -v
- 显示对应的克隆地址,v:verbose.若有多个将全部列出
查看远程仓库信息
- git remote show [remote-name]
添加远程仓库
-
git remote add origin
- 例: git remote show origin
远程仓库的删除和重命名
-
修改某个远程仓库在本地的简短名称
-
git remote rename pb paul
- 把 pb 改成 paul
-
-
删除
- git remote rm paul
从远程仓库抓取本地没有的数据到本地仓库,但没merge
- git fetch [remote-name]
推送数据到远程仓库
-
建议push前先获取远程仓库最新代码,先fetch查看是否有更新,不建议直接pull
-
why
- 别人push后,有可能会代码冲突
-
若fetch后没有更新
- 可放心pull,再push
-
有更新
-
查看差异
-
git diff
- 对比workspace与index
-
git diff HEAD
- 对比workspace与最后一次commit(local repository)
-
-
查看和自己的是否有冲突,没有则可pull,再push
-
有冲突
-
revert
- 把本地冲突代码备份,revert,再pull
- pull成功,把自己备份的代码copy到相应地方再commit、push
-
stash
-
git操作
- git stash
- git pull
- git stash pop
- 再重新add commit push
-
pycharm实际操作
- stash changes
- pull
- unstash changes
-
-
-
-
-
若嫌麻烦没查看是否有更新,直接push失败
-
是否有读写权限?
-
同一时刻有没有其他人在push?
-
若在自己push前其他人已经push,必须pull,再commit、push
- 参考上面提到的
-