发布于 

Git使用

作为半个程序员,怎么能不会使用Git?


一、什么是Git?

是由Linux的开发者Linus为了管理世界各地提交到Linux的代码而开发的版本控制系统,使用的是C语言进行开发。

二、Git本地仓库管理

在进行Git管理之前,首先要对Git的身份进行配置,即告诉别人修改这个文件的人是谁。

1
2
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

Git本地文件的管理主要是三步:

  1. git init 将当前文件夹加入git仓库中进行管理
  2. git add file 将file文件添加到staged暂存区中,可以一次添加一个,也可以使用git add --all将所有已修改的文件添加
  3. git commit 将暂存区的文件提交到repository中,即将本次修改提交,此时需要带-m参数后跟修改信息

为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件。

Git版本控制中的文件分为以下五种状态:

  • Untracked:未跟踪,此文件未加入到git库,不参与版本控制。
  • Unmodify:文件已入到git库中,未修改,文件内容与本地库的文件快照内容完全一致。
  • Modified:文件已入到git库中,经过修改,文件内容与本地库的文件快照内容不一致。
  • staged:暂存状态。
  • committed:暂存区的修改提交到repository中

下图通过命令的形式,更加直观地表达出文件状态的转换过程。(committed状态同属于unmodified状态)

git的四种状态

Git中的工作区和暂存区

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

三、Git远程GitHub仓库管理

  1. 创建ssh-key

    $ ssh-keygen -t rsa -C "youremail@example.com"
    将创建的id_rsa.pub公钥复制粘贴到GitHub的ssh keys里面呢。
    为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。

  2. GitHub上创建repository

    创建之后将本地创建的库同步到GitHub上
    $ git remote add origin git@github.com:NoneFire/gitlearn.git

    这里有个参考资料:github中ssh和https提交的区别 最明显的却别就是提交的时候是否需要验证身份。假如这一步配置错误GitHub的仓库地址,可以通过$ git remote set-url origin git@github.com:NoneFire/gitlearn.git重置url

  3. 将远程仓库主分支的最新变化拉取下来

    git pull origin master
    这个命令适用于创建远程responsity的时候添加了文件或者创建了readme文件的情况。

    如果次数出现fatal: refusing to merge unrelated histories这种提示,参考git出现fatal:refusing to merge unrelated histories错误解决,主要解决方案就是在命令后添加allow-unrelated-histories强制合并两个不同的仓库

  4. 将本地分支提交远程仓库

    $ git push -u origin master

    由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

    注意,这里push到远程仓库的是commit之后的数据。

    如果提交失败的话,使用ssh -T git@github.com测试下是否是网络问题造成的提交失败。

  5. 拉取远程分支并合并

    1
    2
    3
    4
    5
    6
    7
    8
    9
    git checkout -b xx-master master
    git pull git地址 master

    #如果提示fatal: refusing to merge unrelated histories
    git pull origin master --allow-unrelated-histories

    #GitHub传输文件方式
    git remote add origin git@github.com:NoneFire/web_study.git
    git push -u origin master
  6. 合并本地分支

    1
    2
    3
    git checkout master
    git merge --no-ff xx-master
    git push origin master

四、Git分支管理

各个分支可以理解为不同的时间线,之前我们的操作都是在master主分支上进行的,接下来在分支上进行操作。

五、打标签

git tag

标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

六、忽略特殊文件

.gitignore这个文件里自定义规则。

gitigonre管理

七、常用git命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
git add #把文件添加到版本控制系统,--all代表同步所有更改文件到暂存区
git commit [-m] #提交修改到仓库,m后跟修改说明
git status #查看仓库的修改状态
git diff #查看仓库或者指定文件的详细修改内容
git log #查看历史提交记录 格式化输出--pretty=oneline
git reflog #查看每次的提交记录
git reset [--hard] #回滚修改记录
git restore #丢弃工作区的最近一次改动
git restore --staged #撤销已经add到staged中的修改
git remote -v #查看远程分支的情况
git remote add "origin" "responsityaddress" #将本地仓库关联到远程仓库的地址,origin为默认字段可以修改
git remote remove "origin" #解除远程分支origin的关联
git pull origin master #拉取远程分支的最新变化到本地
git push origin master #将本地仓库推送到远程主机名origin的master分支
git pull origin master --allow-unrelated-histories #拉取远程仓库时会遇到问题,故增加后续命令,合并两个分支
git checkout dev [-b,-d] #切换dev分支,-b标识创建并切换到dev分支上,-d删除本地分支
git switch #切换分支的命令
git branch #查看当前所有分支
git merge #合并分支到master分支
git tag #打标签

八、fork更新

https://www.jianshu.com/p/8ab6ef7ce5e3

1
2
3
4
5
# 首先将本地分支关联到源分支
git remote add "upstream" "responsityaddress" #将本地仓库关联到远程仓库的地址,origin为默认字段可以修改
git fetch upstream #将远程源仓库数据拉取下来,pull=fetch+merge


Git速查表