git操作

git基本原理:

git有两个最重要概念:远程分支和本地分支,远程分支通过push命令提交,本地分支通过commit命令提交。想要更新远程分支,需要首先将改动commit到本地分支(如果没有其他分支就是master),然后push到远程分支。一个git项目中的文件有四个区:修改过暂存(stage)的文件区,修改过未暂存的文件区,git未跟踪的文件区,未修改过的文件区。通过add命令将修改过未暂存的文件加入暂存区,这时文件就进入了版本库,再通过commit命令可以将暂存区的文件提交到本地分支,然后通过push命令把这些文件修改更新到远程分支。
本地版本库提交流程图:
git操作

一些名词解释:

master:第一次初始化git仓库时默认的第一个分支,也是当前的主分支
head:指向最新commit的指针

####基本配置
* ssh配置
* 创建ssh
windows中,ssh文件默认在C:\Users\1069\.ssh下。如果没有**id_rsa和公钥 id_rsa.pub,需要手动创建:
ssh-****** -t rsa -C "[email protected]"
ssh公钥要和仓库的公钥一致才能使用ssh clone。
* 设置用户名和密码
git config --global user.name "你的github用户名"
git config --global user.email "你的邮箱地址"

1.本地git操作(下面的操作都是在本地的操作,改变的是本地仓库,和远程仓库无关)

首先cd path进入git仓库所在目录

  • 查看git目前状态:
    git status
    这个命令会显示三部分的内容:
    1. 暂存的文件区(修改后的文件等待commit)
    2. 未暂存的文件区(修改后未使用add命令加入暂存区)
    3. git未跟踪的文件区(git不会跟踪该文件区的变化)
  • 显示文件的变化
    git diff filename
    git diff head -- fileanme(查看工作区和版本库(head指向最新commit)的文件差别)
    ·
  • 将文件加入暂存区:
    git add filepath
    添加多个文件时,文件之间用空格隔开

  • 提交到本地仓库
    git commit -m “commit message”
    提交后有修改再次提交(如往暂存区又添加了一个文件):
    git add forgotten_file
    git commit --amend(会和前一个commit合并成一个commit)

  • 查看本地commit历史
    git log(--pretty=oneline可以只显示commit id和message)

  • 回退到以前(未来)的版本(版本就是每次commit的内容)
    git reset --hard head(最新的commit是head)
    git reset --hard commit-id 返回到指定commit-id的commit(commit-id只需写前几位,git会自动识别,当然也不能写太短,因为容易有多个相同id前缀)
    如果又想回去,只要前面的commit-id还能显示,就能再次调用这个命令回到‘‘未来’’
    当然,如果找不到想回退的commit-id,也有命令可以显示你所有的commit和reset操作:git reflog,这样就可以找到你想会退的commit-id了。
    reset到一个commit后,这个commit以后的所有修改都会以not staged的形式存在。

  • 取消暂存的文件(放入未暂存的文件区)
    git reset head <filepath>
    所以,reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。

  • 撤销文件的修改(把工作区文件与版本库同步)
    git checkout -- filepath
    有两种情况:

    1. 已经commit,则返回到最近的commit时文件的状态
    2. 没有commit,但已经add进暂存区,则返回到add到暂存区时文件的状态。
      总之,checkout返回这个文件最近一次commitadd时的状态
      • 场景1:当你想丢弃目前工作区的修改时,直接git checkout -- filename即可。
      • 场景2:当你已经把工作区的内容add到暂存区,那么要使用git reset head filename就返回到了场景1,然后再按场景1处理。
      • 场景3: 当你已经把工作区的内容add到暂存区,并且commit到了本地分支,那么就需要使用git reset commit-id回退版本,然后再按场景1处理
      • 上述场景都是在你没有push到远程仓库的前提下进行的
        注意:参数中--很重要,不加的话就成了切换到另一个分支。
  • git stash
    当你正在完成一项工作A,而此时有一项bugB需赶紧修改并提交,而提交就可能把A也提交,而你还没有完成A,这时你可以先git stash save "mess"保存当前工作区状态,这样之后工作区就回到了最近一次commit后的状态。stash命令会把工作区压进一个栈里,可以多次运行stash命令。当你完成B,push到远程后,使用git stash pop返回最近的一次保存状态(注意这时也有可能会冲突)。
    git stash pop [email protected]{id}返回到指定id的stash状态。
    注意:pop后会删除当前状态。
    git stash list可以查看当前栈中的所有保存状态。
    git stash drop [stash_id]删除指定id的栈中状态

2. 和远程仓库交互

  • 本地仓库和远程仓库关联
    1. 先有本地库
      假设我们本地仓库已经写好,想推送到github:
      首先应把本地仓库初始化为一个git仓库:
      mkdir git_test(如果已经创建则跳过此步)
      cd git_test
      git init(初始化成git仓库)
      然后在github创建一个新仓库
      最后,本地仓库关联远程仓库git remote add origin https://github.com/bobobe/test.git(origin这时就是远程仓库的名字,这是默认的叫法,也可以换成其他名字)
    2. 先有远程库
      直接clone即可
      git clone origin_name.git "my_path"
  • 提交到远程仓库(待完善)
    git push <远程主机名> <本地分支名> <远程分支名>
    例如 git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名
    常用:git push origin mastergit push -u origin master

  • 从远程仓库拉取最新内容
    git pull
    有时你push到远程仓库时会失败,提示信息为你本地仓库版本落后于远程仓库版本,即其他人又提交了代码,需要先拉取远程仓库。如果拉取后和你本地仓库没有冲突,则合并成功,你只需再次push即可。这种情况常见于你和其他人修改的不是同一个文件。
    但大多数情况下都会产生冲突,这时就需要解决冲突。冲突发生后,在冲突的文件里git会标注冲突的内容:
    <<<<<<< HEAD
    ttt
    =======
    eee
    左箭头到等号之间的内容是你本地仓库的内容,等号后面的为远程仓库的内容。
    解决完冲突后,把这些标识符都去掉。然后再次add,commit,push即可。

3.github操作

  • fork
    git操作