[关闭]
@WillireamAngel 2018-05-13T02:35:00.000000Z 字数 8461 阅读 1838

Git基础教程

Git


Git简介

  1. 官网:https://git-scm.com/
  2. Git:由Linus开发的基于C语言的分布式版本控制工具。

安装Git

1.Linux:sudo apt-get install git or sudo apt-get install git-core
all in "https://git-scm.com/download/linux"
2.Windows
Directly download and install later
To Configure the users and e-mail:

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

创建版本库(repository)

  1. 第一步,选择一个合适的地方,创建一个空目录:
  1. $ mkdir learngit
  2. $ cd learngit
  3. $ pwd`
  4. /f/计算机/Git/learngit

其中,mkdir用于创建在当前目录创建文件夹,cd用于进入文件夹,pwd用于显示当前目录
2. 第二步,通过git init命令把这个目录变成Git可以管理的仓库:

  1. $ git init
  2. Initialized empty Git repository in F:/计算机/Git/learngit/.git/
  1. 把文件添加到版本库
    1.所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等。(不支持类似于word的二进制编码)
    2.Windows TXT记事本在每个文件开头添加了0xefbbbf(十六进制)的字符,因此显示的utf-8格式并不完整。
    3.创建文件放到相应库文件夹,然后采用以下代码。
    (1)git add files添加文件到库
    for example:
  1. $ git add readme.txt

(2)git commit -m "description"告诉git提交到git仓库
for example:

  1. $ git commit -m "wrote a readme file"
  2. [master (root-commit) 4ab957c] wrote a readme file
  3. 1 file changed, 2 insertions(+)
  4. create mode 100644 readme.txt

时光机穿梭

  1. 基本查询:
    1.查看仓库当前状态:git status
  1. $ git status
  2. On branch master
  3. Changes not staged for commit:
  4. (use "git add <file>..." to update what will be committed)
  5. (use "git checkout -- <file>..." to discard changes in working directory)
  6. modified: readme.txt
  7. no changes added to commit (use "git add" and/or "git commit -a")

2.查看difference:git diff files(先查看difference后再add+commit提交)
3.cat file列出相关文件具体内容。
2. 版本回退:
1.git log查看版本信息历史记录(提交日志);
git log --pretty=oneline
2.版本回退:在Git中,HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上n个版本可写成HEAD~n。代码表示为git reset --hard HEAD~n
for example:

  1. $ git reset --hard HEAD^
  2. HEAD is now at 29f1ba8 wrote changed

3.回到原始版本或者某一特定版本:git reset --hard commit id
或者使用命令记录查找回退版本:git reflog

  1. $ git reflog
  2. f657feb HEAD@{0}: reset: moving to f657febccf33b8db38ddb3b75dbd3ecb86d0286d
  3. 29f1ba8 HEAD@{1}: reset: moving to HEAD^
  4. f657feb HEAD@{2}: commit: append GPL
  5. 29f1ba8 HEAD@{3}: commit: wrote changed
  6. 3d8bff2 HEAD@{4}: commit: wrote a readme file v0.1
  7. 4ab957c HEAD@{5}: commit (initial): wrote a readme file
  1. 工作区和暂存区
    工作区:Working Directory
    版本库:.git隐藏文件夹
    git版本库

How to understand Stage:
1.The first step
add new files
2.The second step
commit new files
4. 管理修改:git只接收add+commit的修改信息,add将修改放入暂存区,然后commit将暂存区文件保存。
5. 撤销修改:
命令git checkout -- readme.txt意思是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
1.一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
2.一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
即将此文件回到最近一次git commit或git add时的状态。
具体操作(已使用add):
1.cat file

  1. $ cat readme.txt
  2. Git is a distributed version control system.
  3. Git is free software distributed under the GPL.
  4. Git has a mutable index called stage.
  5. Git tracks changes of files.
  6. My stupid boss still prefers SVN.

2.git reset HEAD file回退版本

  1. $ git reset HEAD readme.txt
  2. Unstaged changes after reset:
  3. M readme.txt

3.git status核查暂存区

  1. $ git status
  2. On branch master
  3. Changes not staged for commit:
  4. (use "git add <file>..." to update what will be committed)
  5. (use "git checkout -- <file>..." to discard changes in working directory)
  6. modified: readme.txt
  7. no changes added to commit (use "git add" and/or "git commit -a")

4.git checkout -- readme.txt
5.git status

  1. $ git status
  2. On branch master
  3. nothing to commit, working tree clean

6.cat file

  1. $ cat readme.txt
  2. Git is a distributed version control system.
  3. Git is free software distributed under the GPL.
  4. Git has a mutable index call=ed stage.

done
6. 删除文件
1.一般情况下,通常直接在文件管理器中把没用的文件删了,或者用rm命令删了。
2.两种现象:
一、确定要将该文件删除,使用git rm命令,并且git coimmit;
二、删错了,git checkout将误删的文件恢复到最新版本。
3.你可以利用git恢复删除的文件上传到git库的最新的版本文件,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

远程仓库

  1. 与GitHub对接的准备
    1.Create SSH Key:
  1. $ ssh-keygen -t rsa -C "15521126382@qq.com"

正常的话,用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
2.Add SSH key:
add ssh key
2. 添加远程库:
1.在GitHub中create new repository
2.本地库链接库:git remote add origin git@server-name:path/repo-name.git

  1. $ git remote add origin git@github.com:WillireamAngel/learngit.git

3.本地库推到远程库上:

  1. $ git push -u origin master
  2. Counting objects: 23, done.
  3. Delta compression using up to 4 threads.
  4. Compressing objects: 100% (16/16), done.
  5. Writing objects: 100% (23/23), 1.80 KiB | 0 bytes/s, done.
  6. Total 23 (delta 6), reused 0 (delta 0)
  7. remote: Resolving deltas: 100% (6/6), done.
  8. To github.com:WillireamAngel/learngit.git
  9. * [new branch] master -> master
  10. Branch master set up to track remote branch master from origin.

远程库推送,利用git push命令,实际上是把当前分支master推送到远程。
第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
4.把本地master分支全部推到Github

  1. $ git push origin master
  2. Everything up-to-date
  1. 从远程库克隆:git clone git@github.com:servername/repositoryname.git
  1. $ git clone git@github.com:WillireamAngel/gitskills.git
  2. Cloning into 'gitskills'...
  3. remote: Counting objects: 3, done.
  4. remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
  5. Receiving objects: 100% (3/3), done.
  1. Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

分支管理

  1. 创建与合并分支
    1.创建分支:git branch 分支名
    2.切换分支:git checkout 分支名
    3.查看当前分支:git branch
    United:git checkout -b 分支名
  1. $ git checkout -b dev
  2. Switched to a new branch 'dev'
  3. M readme.txt
  4. $ git branch
  5. * dev
  6. master

4.对现有的readme.txt文件进行修改,例如添加Creating a new branch is quick.
5.提交相关分支修改

  1. $ git add readme.txt
  2. $ git commit -m "branch test"
  3. [dev cfc17c4] branch test
  4. 1 file changed, 3 insertions(+), 1 deletion(-)

6.切换分支git checkout 分支名

  1. $ git checkout master
  2. Switched to branch 'master'
  3. Your branch is up-to-date with 'origin/master'.

7.检查相关文件提交内容,发现并未修改

  1. $ cat readme.txt
  2. Git is a distributed version control system.
  3. Git is free software distributed under the GPL.
  4. Git has a mutable index called stage.

8.合并制定 分支到当前分支git merge 分支名

  1. $ git merge dev
  2. Updating f213a5c..cfc17c4
  3. Fast-forward
  4. readme.txt | 4 +++-
  5. 1 file changed, 3 insertions(+), 1 deletion(-)

其中Fast-forward是快进模式,但并非每个合并都是快进模式
9.删除分支git branch -d 分支名

  1. $ git branch -d dev
  2. Deleted branch dev (was cfc17c4).

10.检查相关分支及相关文件内容

  1. $ git branch
  2. * master
  3. $ cat readme.txt
  4. Git is a distributed version control system.
  5. Git is free software distributed under the GPL.
  6. Git has a mutable index called stage.
  7. Creating a new branch is quick.
  1. 解决冲突
    在进行两次不一样的修改时会出现冲突:
    git 冲突
    然后我们可以查看相关文件,会出现相关的介绍.Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。
    为了避免出现冲突,我们要对现有冲突文件进行重新修改,然后再进行提交后冲突消失。
    git 冲突解决
  2. 分支管理策略
    Git中的Fast forward模式会丢掉删除的分支信息,采用--no-ff方式强制禁用Fast forward,同时生成一个commit,并利用- m书写相关描述。
    操作:
    1.首先,仍然创建并切换dev分支:
  1. $ git checkout -b dev
  2. Switched to a new branch 'dev'

2.修改readme.txt文件,并提交一个新的commit:

  1. $ git add readme.txt
  2. $ git commit -m "add merge"
  3. [dev 6224937] add merge
  4. 1 file changed, 1 insertion(+)

3.现在,我们切换回master:

  1. $ git checkout master
  2. Switched to branch 'master'

4.准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward:

  1. $ git merge --no-ff -m "merge with no-ff" dev
  2. Merge made by the 'recursive' strategy.
  3. readme.txt | 1 +
  4. 1 file changed, 1 insertion(+)

5.因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
分支策略

在实际开发中,我们应该按照几个基本原则进行分支管理:
master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活,干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本。
4. Bug分支:
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

  1. $ git stash
  2. Saved working directory and index state WIP on naive: fa8a0a3 conflict fixed
  3. HEAD is now at fa8a0a3 conflict fixed

git stash pop=git stash apply(恢复内容)+git stash drop(删除相关stash文件)
利用git stash list可以查看相关stash内容
5. Feature分支
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

  1. $ git branch -d future
  2. error: The branch 'future' is not fully merged.
  3. If you are sure you want to delete it, run 'git branch -D future'.
  1. 多人协作:
    1.推送分支git push 仓库名 分支名
  1. $ git push origin master
  2. Counting objects: 12, done.
  3. Delta compression using up to 4 threads.
  4. Compressing objects: 100% (12/12), done.
  5. Writing objects: 100% (12/12), 1.18 KiB | 0 bytes/s, done.
  6. Total 12 (delta 5), reused 0 (delta 0)
  7. remote: Resolving deltas: 100% (5/5), completed with 1 local object.
  8. To github.com:WillireamAngel/learngit.git
  9. f213a5c..fa8a0a3 master -> master

2.常用分支推送需要:
- master分支是主分支,因此要时刻与远程同步;
- dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
- bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
- feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
3.抓取分支
从本地推送分支,使用git push origin branch-name;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功.

标签管理

  1. 创建标签
    1.命令git tag <name>用于新建一个标签,默认为HEAD(当前分支),也可以指定一个commit id:git tag <name> commit id
    2.git tag -a -m "blablabla..."可以指定标签信息;
    3.git tag -s -m "blablabla..."可以用PGP签名标签;
    4.命令git tag可以查看所有标签。
  1. $ git branch
  2. * master
  3. naive
  4. $ git tag v1.0
  5. $ git tag v0.9 b605eb9
  6. $ git tag -a v0.1 -m "version 0.1 released" 0801a49
  7. $ git tag -s v0.2 -m "signed version 0.1 released" fa8a0a3
  8. $ git show v0.1
  9. ......
  10. $ git tag
  11. v0.9
  12. v1.0
  13. ......
  1. 操作标签(删除标签)
    1.命令git push origin <tagname>可以推送一个本地标签;
    2.命令git push origin --tags可以推送全部未推送过的本地标签;
    3.命令git tag -d <tagname>可以删除一个本地标签;
    4.命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

使用GitHub

在GitHub上,可以任意Fork开源仓库;自己拥有Fork后的仓库的读写权限;
可以推送pull request给官方仓库来贡献代码。

自定义Git

  1. 忽略特殊文件
    1.忽略某些文件时,需要编写.gitignore
    .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!
    2.忽略文件的原则是:
    忽略操作系统自动生成的文件,比如缩略图等;
    忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
    忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
    3.所有配置文件可以直接在线浏览:https://github.com/github/gitignore
  2. 配置别名
    git config --global alias.别名 原命令
    1.配置--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用;
    2.配置文件的位置是git/config/alias;
    3.当前用户的Git配置文件是放在用户目录下的一个隐藏文件.gitconfig中。
  3. 搭建Git服务器
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注