Git总结

基本操作

有三种文件存储的地方:本地文件夹、本地暂存区、远程仓库

本地操作

初始化

  • git init初始化本地文件夹,会创建一个.git子目录,暂存区等各种信息都在里面

  • git clone <url>把远程url对应的仓库克隆到本地,里面也有一个.git子目录

文件更新

  • git add <filename>开始跟踪文件(并添加到暂存区),或者暂存文件的更新(如果之前已经跟踪了文件,而且文件发生了变化)

  • git commit提交暂存区的内容(仍然在本地),会调用文本编辑器开始编辑说明文字

    • -m可以在命令后面直接接上一行说明文字
    • -amend替换上次的提交的注释文字
  • git reset --hard HEAD^回退commit

    • --hard会撤销commit、撤销add、恢复代码
    • --soft只撤销commit
    • --mixed撤销commit、撤销add

    可以先git add . && git commit -m tmp生成临时提交,之后再完全退回到上次提交

分支管理

一次commit对应有一个commit对象,其中有父对象的指针,所有commit连起来形成类似于树的结构。

分支就可以认为是指向某个commit对象的指针,HEAD也是一个指针,指向当前的commit对象

  • git branch查看分支

    • 后面指定分支名则是创建分支
    • -d删除分支
    • -v显示分支对应的最后一次提交
    • --merged显示合并到当前分支的(这些分支其实可以删掉),再加一个分支名则查看合并到指定分支的分支
  • git checkout <分支名>切换到指定分支(移动HEAD指针)

    • -b创建并切换
  • git checkout <commitId>切换到指定的commit

  • git merge <分支名>把当前分支与指定分支合

    如果不是一条线直连的,可能要手动解决冲突,然后会建立一个新的commit(用到公共祖先)

  • git rebase <分支名> 把当前分支摘下,嫁接到指定分支

    git rebase -i <要合并的几个commit的前一个commit_sha>:弹出编辑器提示要pick保留的commit(从旧到新排),把不需要保留的commit前面的pick改为s,关掉后又会弹出编辑新的commit信息。如果是合并已经push的commti,需要先pull,然后弹窗提示编辑说明merge的理由,再push并不会删掉commit,反而多了一个merge操作。

远程操作

  • git remote查看远程仓库
    • -v选项显示具体url,clone来的仓库默认名为origin
    • -add <shorname> <url>选项添加远程链接
    • renameremove改名和移除
  • git fetch <shortname or url>抓取数据(不合并)
  • git pull自动抓取并且合并
  • git push推送到上游(要先抓取、合并,保证没有冲突)

零散

  • git status查看文件状态,Changes to be comitted就是已经暂存的,not staged是还没有暂存的

    • -s--short简短显示:M修改了,A添加跟踪,??未跟踪,MM修改后暂存又修改
  • git diff查看未暂存文件的改动

    • --staged--cached查看已暂存的改动(相对于最后一次提交)
  • git log查看提交记录

    • -p--patch显示修改的文件
    • -2只显示2条
  • 修改.gitignore后生效

    git rm -r --cached . 清除缓存然后重新提交

.gitignore规则

默认可以是任意中间目录,**/表示任意目录下,/开头表示根目录下。/结尾表示文件夹,/*结尾表示忽略目录下所有内容,而不包括目录本身,使用!强制保留时需要这个*

1
2
/bin/*      # 注意结尾要用*
!/bin/t.txt # 并且要写在上面通配版规则的下面

更多

参考progit

添加SSH Key

打开任意文件夹,右键空白处git bash here

  1. ssh-keygen -t rsa -C "邮箱地址",回车

  2. 根据提示设置保存文件名,默认是~/.ssh/id_rsa。如果是多个账号,一定要指定其它文件名或路径。

    之后一路回车

  3. 到浏览器中登录github,在Settings里找到SSH and GPG keys一栏,点击New SSH Key。复制上一步生成的id_rsa.pub(跟id_rsa同路径)里的内容粘进去

多账号配置

打开文件夹,右键空白处git bash here,直接git clone git@github.com:xxxxx/xxx.git,可能会报错:

1
2
3
4
5
ERROR: Repository not found.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

因为这个私有仓库的所有者跟全局配置的不一样,自然就不允许下载,需要进行一些设置

配置连接远程仓库使用的SSH Key

方法一

  1. ssh-add -l查看本地key:

    1
    The agent has no identities.

    如果报错:

    1
    Could not open a connection to your authentication agent.

    需要先执行ssh-agent bash

  2. ssh-add ~/.ssh/xxxx/id_rsa添加一个key,如果key是保存在默认路径~/.ssh/id_rsa,可以直接ssh-add

    再执行ssh-add -l就可以看到添加的key

    如果不小心添加错了,可以ssh-add -d删掉

  3. ssh -T git@github.com,对的话应该是

    1
    Hi xxxxx! You've successfully authenticated, but GitHub does not provide shell access.
  4. 这时候执行git clone git@github.com:xxxxx/xxx.git就可以成功了

方法二(正解)

方法一只是临时的,一旦终端关闭,下次就又要重新执行所有步骤。方法二可以从源头解决问题,而且很简单

  1. 在磁盘上找到~/.ssh/config,添加配置

    1
    2
    3
    4
    5
    6
    # xxxx是github用户名
    Host xxxx.github.com # 这是一种标识符,默认账号的是github.com,这里只要取得跟默认的不一样就行
    HostName github.com # 这是实际的服务器域名
    User xxxx # 这个无关紧要
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/xxxx/id_rsa # 这个就是标识符对应的key路径
  2. 测试配置,@后面就是设置的标识符

    1
    ssh -T git@xxxx.github.com

    成功的话,会输出

    1
    Hi xxxx! You've successfully authenticated, but GitHub does not provide shell access.
  3. 把clone用的url里的github.com改成对应账号的标识符,比如

    1
    git clone git@xxxx.github.com:xxxx/MyRepoName.git

    这样执行clone时就会使用对应的key了~

如果已经使用方法一clone了仓库,可以进入找到仓库里.git/config文件,按方法二修改其中的url字段就可以了

原问题

设置本地仓库的个人信息

cd xxx进入仓库文件夹

git config --local user.name xxxx设置提交者用户名

git config --local user.email xxxx@xx.com设置提交者邮箱

git config --local --list检查设置

提交PR

fork源仓库

打开浏览器,进入源仓库,点击fork,选择自己的账号,然后会跳转到fork后的仓库页面

clone到本地

复制fork后的仓库链接,打开文件夹,右键空白处git bash here

按照上面多账号配置的步骤,依次执行

1
2
3
ssh-agent bash
ssh-add ~/.ssh/xxx/id_rsa
ssh -T git@github.com

然后git clone git@github.com:xxxxx/xxx.gitcd进去,然后进行一些设置

1
2
3
git config --local user.name xxxxx
git config --local user.email xxxx@xx
git config --local --list

添加源仓库链接

git remote -v看到的是自己fork来的仓库地址,名字为origin

git remote add upstream git@github.com:xxxxx/xxx.git添加源仓库的地址,并命名为upstream

推送到fork后的仓库

修改文件后,执行

1
2
3
git add .
git commit
git push origin

创建pull request

打开浏览器,查看自己fork来的仓库,会看到仓库上会有提示

1
This branch is 1 commit ahead of xxxxx:xxx

旁边有个下拉选项Contribute,可以选择Open pull request

还有个下拉选项是Fetch upstream,如下显示说明已经跟上游同步了

1
This branch is not behind the upstream xxxx:xxx.

选择Open pull request,进去后点击Create pull request

写点东西,然后再点Create pull request,等待仓库管理员合并

合并PR

打开浏览器仓库页面,点击Pull requests一栏,点进别人的PR。写点东西交流下,没问题就点击Merge pull request,按钮旁边也有说明如何用命令行来合并