image.png

1. 三大模块

1352126739_7909.jpg
上图很清晰的表明了git的工作流程,其中有三个主要的概念:

工作区:也就是我们本地能看到的电脑文件夹。 版本库:又叫仓库,是git管辖范围内的,在工作区中的隐藏目录.git中(它不属于工作区)。 暂存区:Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区; 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

2. 相关配置操作

  1. #查看远程连接的仓库
  2. git remote show origin
  3. #移除已经连接的远程残酷
  4. git remote rm origin
  5. #查看用户名和邮箱
  6. git config user.name
  7. git config user.email
  8. #配置用户名和邮箱
  9. git config --global user.name "username"
  10. git config --global user.email "email"
  11. #远程连接仓库
  12. git remote add origin 仓库地址

3. add

  1. # 他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,
  2. # 包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。
  3. git add .
  4. # 他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。
  5. # add -u 不会提交新文件(untracked file)。(git add --update的缩写)
  6. git add -u
  7. # 是上面两个功能的合集(git add --all的缩写)
  8. 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 冲突解决办法:

  1. 先git stash 保存本地代码至暂存栈
  2. 再git pull
  3. 再git stash pop (merge后手动解决冲突)

    6. 撤销

    6.1 撤销未add的文件修改

    git checkout

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

  1. 先git reset 回退版本,再git push -f 强制覆盖远程仓库(解决遇到non-fast-forward当前分支的版本低于远程分支的版本情况)
  2. 遇到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

解决合并产生多个commit和问题,更优雅的合并代码。

4. checkout/reset/分支

checkout相关参数说明git (用于切换分支,或者恢复未add到暂存区(版本库)的文件)

  1. # 创建并切换分支
  2. git checkout -b mybranch
  3. # 切换分支
  4. git checkout mybranch
  5. # 创建分支
  6. git branch mybranch
  7. # 查看分支
  8. git branch -a
  9. # 分支重命名
  10. git branch -m old new
  11. # 分支恢复
  12. git branch recover_branch(新分支名) commit_id
  13. # 比较不同分支差异
  14. git diff branch1 branch2 --stat # 列出不同的文件
  15. 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”里面的公钥)即可。