1. 三大模块
上图很清晰的表明了git的工作流程,其中有三个主要的概念:
工作区:也就是我们本地能看到的电脑文件夹。 版本库:又叫仓库,是git管辖范围内的,在工作区中的隐藏目录.git中(它不属于工作区)。 暂存区:Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区; 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
2. 相关配置操作
#查看远程连接的仓库
git remote show origin
#移除已经连接的远程残酷
git remote rm origin
#查看用户名和邮箱
git config user.name
git config user.email
#配置用户名和邮箱
git config --global user.name "username"
git config --global user.email "email"
#远程连接仓库
git remote add origin 仓库地址
3. add
# 他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,
# 包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。
git add .
# 他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。
# add -u 不会提交新文件(untracked file)。(git add --update的缩写)
git add -u
# 是上面两个功能的合集(git add --all的缩写)
git add -A
4. commit
git commit -m “注释”
提交代码改动到暂存区
git commit —amend
5. push
git push
提交到远程仓库
谨慎只用push!push之前代码均在本地可以随意改动,push之后代码同步到远程协同代码库,再进行改动比较麻烦。
6. pull
git pull = git fetch + git merge
git pull 冲突解决办法:
6.2 撤销已add未提交的文件
git reset HEAD
6.3 撤销未push的提交
git reset
/HEAD^ git revert /HEAD^
两者主要区别如下:
- git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit
- git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容
- 在回滚这一操作上看,效果差不多。但是在日后继续 merge 以前的老版本时有区别
6.4 撤销push
- 先git reset 回退版本,再git push -f 强制覆盖远程仓库(解决遇到non-fast-forward当前分支的版本低于远程分支的版本情况)
- 遇到pre-receive hook declined,进入所在项目的settings,取消相应分支的protected,恢复后再加上protected
rebase
rebase 经常用于合并提交和分支git rebase -i [startpoint] [endpoint]
其中-i的意思是—interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint][endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。
git rebase -i HEAD~3
弹出交互式vim页面,进行编辑合并。
git rebase —edit-todo
重新编辑
git rebase —continue
只要你的分支上需要 rebase 的所有 commits 历史还没有被 push 过,就可以安全地使用 git-rebase来操作。
git pull —rebase
4. checkout/reset/分支
checkout相关参数说明git (用于切换分支,或者恢复未add到暂存区(版本库)的文件)
# 创建并切换分支
git checkout -b mybranch
# 切换分支
git checkout mybranch
# 创建分支
git branch mybranch
# 查看分支
git branch -a
# 分支重命名
git branch -m old new
# 分支恢复
git branch recover_branch(新分支名) commit_id
# 比较不同分支差异
git diff branch1 branch2 --stat # 列出不同的文件
git diff branch1 branch2 file # 指定问文件的差异
reset相关参数说明
--mixed
# 不删除工作空间改动代码,撤销commit,并且撤销git add . 操作
# 为默认参数,git reset --mixed HEAD 和 git reset HEAD 效果一样,可用于撤销已经add/commit的代码
--hard
# 删除工作空间改动代码,撤销commit,撤销git add .
注意完成这个操作后,就恢复到了上一次的commit状态。
--soft
# 不删除工作空间改动代码,撤销commit,不撤销git add .
checkout/reset 用于版本回退操作
# 删除git已经追踪的文件,(让gitignore重新起作用)
git rm --cached file
# 修改commit名称
git commit --amend
# 对于未add的文件
git checkout . # 撤销对所有已修改但未提交的文件的修改,但不包括新增的文件
git checkout [filename] # 撤销对指定文件的修改,[filename]为文件名
# checkout的另一种用法:版本切换
git checkout commit_id # 以临时分支的形式切换到其他版本号,会保存最新版本(位于master分支)
# 对于已经add,但未commit的文件
git reset HEAD
# 对于已经add/commit,但未push的文件
git reset --hard commit_id # 回滚后代码文件也会回滚(也可用于切换版本,但不会保存最新分支,注意与checkout区别)
git reset commit_id # 撤销提交后代码不会回滚
# checkout和reset这两个命令都不会对新增文件起作用。因为新增的文件是还未加到 git 的记录里面的,
# 即属于未被 tracked 的状态,所以撤销修改和回退均对其不影响。我们直接手动删除文件即可。
5. 打tag操作
# 当前版本打标签:标签都只存储在本地,不会自动推送到远程。
git tag <name>
# 查看
git tag # 查看标签名
git tag -ln # 查看标签名——备注
git show tag # 查看标签对应的commit及其他详细信息
# 在历史提交上打 tag
git tag <tag_name> <commit_id>
# 带有说明的标签,用-a指定标签名,-m指定说明文字
git tag -a <tag_name> -m 'wjq_version' <commit_id>
# 删除本地标签
git tag -d <tag_name>
# 删除远程标签
git push origin :refs/tags/<tag_name>
# 推送某个标签到远程
git push origin <tag_name>
# 一次性推送全部尚未推送到远程的本地标签
git push origin --tags
# 一次性拉下全部远程标签
git pull origin --tags
8. git stash
git stash
# 把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。
# 这样就不必提交push后,再临时切换其他分支修改代码
# stash是本地的,不会通过git push命令上传到git server上
git stash -a #stash所有修改(包括新增文件)
git stash list # 查看stasg栈中的元素
git stash show # 查看修改地方
git stash pop stash@{1} # 恢复之前最近缓存的工作目录并删除stash栈中该缓存
git stash apply # 将缓存堆栈中的stash多次应用到工作目录中,但并不删除stash拷贝
9. git 修改密码,重新pull登录密码
git config --system --unset credential.helper
git config --global credential.helper store
Other Git SSH Key 生成
3.1 设置Git的user name和email:
$ git config --global user.name "DevonChina"
$ git config --global user.email "admin@fanxiao2.net"
3.2 生成SSH秘钥
先查看是否已经有了ssh密钥:cd ~/.ssh,如果没有密钥则不会有此文件夹,有则备份删除,随后生成新秘钥:
$ ssh-keygen -t rsa -C "admin@fanxiao2.net"
按3个回车,密码为空,一次会大致显示如下信息:
Your identification has been saved in /home/tekkub/.ssh/id_rsa.
Your public key has been saved in /home/tekkub/.ssh/id_rsa.pub.
The key fingerprint is:
.........
最后得到了两个文件:id_rsa和id_rsa.pub,随后将其添加到ssh
ssh-add id_rsa id_rsa.pub
在github中添加相应的秘钥(注意这要添加的是“id_rsa.pub”里面的公钥)即可。