git操作

文章目录

        • git基本原理:
        • 一些名词解释:
        • 基本配置
        • 1.本地git操作(下面的操作都是在本地的操作,改变的是本地仓库,和远程仓库无关)
        • 2. 和远程仓库交互
        • 3.github操作

git基本原理:

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

一些名词解释:

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

基本配置

  • ssh配置
  • 创建ssh
    windows中,ssh文件默认在C:\Users\1069\.ssh下,liunx中存在用户根目录~/.ssh下。如果没有密钥id_rsa和公钥 id_rsa.pub,需要手动创建:
    ssh-keygen -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
    所以,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 stash@{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操作

  • 首先在github仓库中添加你本地生成的公钥。
  • fork
    git操作_第2张图片

你可能感兴趣的:(git,git)