当前位置:首页>

文章详细页

git使用教程

分类:版本控制


目录
======== 安装
==== 创建版本库
==== 添加
==== 修改
==== 回退及前进
==== 撤销修改(包含三种情形)
==== 删除

======== 远程仓库
==== 把本地仓库推送到GitHub仓库
==== 从远程库克隆

======== 分支管理
==== 解决冲突

======== git常用命令
======== git使用流程规范



Git跟踪并管理的是修改,而非文件。每次修改,如果不add到暂存区,那就不会加入到commit中。



======== 安装

1、在Linux上安装Git

Debian或Ubuntu下的安装:
$ sudo apt-get install git

可以直接通过源码安装。先从Git官网下载源码,然后解压,依次输入:
$ ./config
$ make
$ sudo make install


2、在Windows上安装Git

在官网下载https://git-scm.com/downloads,安装完成后,在开始菜单里找到“Git”->“Git Bash”
设置用户名和邮箱
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"


       workspace: 本地工作目录
  index:缓存区域,临时保存本地改动
  local repository: 本地仓库
  remote repository:远程仓库

==== 创建版本库

$ mkdir git_test //创建一个版本库git_test
$ cd git_test
$ pwd //查看当前工作路径
/d/git_test

$ git init //把这个目录变成Git可以管理的仓库
Initialized empty Git repository in D:/git_test/.git/

==== 添加

$ git add file1.txt
$ git add file2.txt file3.txt //把文件添加到版本库
$ git commit -m "add 3 files." //提交并注释

$ git status //随时掌握工作区的状态

==== 修改

#修改文件后,查看文件的修改内容
$ git diff file1.txt

#确认后提交修改
$ git add file1.txt
$ git commit -m "modify file1.txt"

$ git status //随时掌握工作区的状态

==== 回退及前进

$ git log //显示从最近到最远的提交日志
$ git log --pretty=oneline //精简一行显示提交日志

在Git中,版本表示如下:
    HEAD 当前版本号
    HEAD^ 上一个版本号
    HEAD^^ 上上一个版本号
    HEAD~100 往上100个版本号

#回退版本
$ git reset --hard HEAD^


#指定回到未来的某个版本:版本号没必要写全,前几位就可以了,Git会自动去找
$ git reset --hard 11fb
HEAD is now at 11fb1b4 modify file1.txt

#显示历史命令
$ git reflog


==== 撤销修改(包含三种情形)

一种是修改后没有执行add,即文件还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是修改后已经add了,即文件已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
$ git checkout -- file1.txt

但是已经add后,想把文件从暂存区中回退到工作区,可以执行:
$ git reset HEAD file1.txt
这时再执行checkout将工作区的修改撤销
$ git checkout -- file1.txt

==== 删除

rm test.txt
$ git status //工作区和版本库不一致,显示删除的文件

现在有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
$ git rm test.txt
$ git commit -m "remove test.txt"

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt



======== 远程仓库

由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:

第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen -t rsa -C "youremail@example.com"

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:填入id_rsa.pub中的内容


==== 把本地仓库推送到GitHub仓库

#其中git@github.com:用户名/项目名.git
$ git remote add origin git@github.com:promisingccy/ccy_test.git

#如果报错 fatal: remote origin already exists. 先执行如下语句
$ git remote rm origin

#成功后,就可以把本地库的所有内容推送到远程库上
$ git push -u origin master

推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样

从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master
把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!


==== 从远程库克隆
$ git clone git@github.com:promisingccy/clone_test.git


======== 分支管理

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。


#创建dev分支,然后切换到dev分支:
$ git checkout -b dev
Switched to a new branch 'dev'

#git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

#然后,用git branch 会列出所有分支,当前分支前面会标一个*号:
$ git branch
* dev
  master

#在dev分支上正常提交修改
$ git add readme.txt
$ git commit -m "branch test"
[dev fec145a] branch test
 1 file changed, 1 insertion(+)

#dev分支的工作完成,切换回master分支:
$ git checkout master
Switched to branch 'master'

切换回master分支后,再查看刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变。

#把dev分支的工作成果合并到master分支上
$ git merge dev

git merge命令用于合并指定分支到当前分支。

#删除dev分支
$ git branch -d dev
Deleted branch dev (was fec145a).

#删除后,查看branch,就只剩下master分支了
$ git branch
* master



查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>


==== 解决冲突

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
$ git log --graph --pretty=oneline --abbrev-commit

#查看看到分支合并图
$ git log --graph

#删除分支
$ git branch -d feature1





======== git常用命令

== git配置 ==
git config --list //查看当前git的配置,Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)

== 查看信息 ==
$ git log //查看提交记录
$ git status //查看修改状态
$ git diff //查看详细修改内容
$ git show //显示某次提交的内容
$ git branch //列出所有本地分支
$ git tag //列出所有tag
$ git reflog //显示当前分支的最近几次提交

== 新建代码库 ==
$ git init //在当前目录新建一个Git代码库
$ git init [project-name] //新建一个目录,将其初始化为Git代码库
$ git clone [url] //下载一个项目和它的整个代码历史

== 增加/删除 ==
$ git add [file1] [file2] ... //添加指定文件到暂存区
$ git add [dir] //添加指定目录到暂存区,包括子目录
$ git add . //添加当前目录的所有文件到暂存区
$ git rm [file1] [file2] ... //删除工作区文件,并且将这次删除放入暂存区
$ git mv [file-original] [file-renamed] //改名文件,并且将这个改名放入暂存区

== 代码提交 ==
$ git commit -m [message] //代码提交到本地仓库
$ git commit [file1] [file2] ... -m [message] //提交指定文件到本地仓库
$ git commit -a //提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -v //提交时显示所有diff信息
$ git commit --amend -m [message] //使用一次新的commit,替代上一次提交,如果代码没有任何新变化,则用来改写上一次commit的提交信息
 
== 分支管理 ==
$ git branch -r //列出所有远程分支
$ git branch -a //列出所有本地分支和远程分支
$ git branch [branch-name] //新建一个分支,但依然停留在当前分支
$ git checkout -b [branch] //新建一个分支,并切换到该分支
$ git checkout [branch-name] //切换到指定分支,并更新工作区
$ git checkout - //切换到上一个分支
$ git merge [branch] //合并指定分支到当前分支(如master)
$ git branch -d [branch-name] //删除分支
$ git push origin --delete [branch-name] //删除远程分支
$ git branch -dr [remote/branch] //删除远程分支

== 远程同步 ==
$ git fetch [remote] //下载远程仓库的所有变动,到index
$ git pull //更新本地仓库至最新改动,到workspace
$ git remote -v //显示所有远程仓库
$ git remote show [remote] //显示某个远程仓库的信息
$ git remote add [shortname] [url] //增加一个新的远程仓库,并命名
$ git pull [remote] [branch] //取回远程仓库的变化,并与本地分支合并
$ git push origin master //推送至master分支
$ git push [remote] [branch] //上传本地指定分支到远程仓库
$ git push [remote] --force //强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --all  //推送所有分支到远程仓库

== 撤销 ==
$ git reset [file] //重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset --hard //重置暂存区与工作区,与上一次commit保持一致
$ git checkout //从index恢复到workspace
$ git checkout . //恢复暂存区的所有文件到工作区
$ git checkout -- files //文件从index恢复到workspace
$ git checkout HEAD -- files //文件从local repository复制到workspace
 
== 冲突解决 ==
$ git diff //对比workspace与index
$ git diff HEAD //对于workspace与最后一次commit
$ git diff <source_branch> <target_branch> //对比差异
$ git add <filename> //修改完冲突,需要add以标记合并成功



======== git使用流程规范
        
      提交分支
      撰写commit信息
      与主干同步
      合并commit
      推送到远程仓库
      发出pull request,请求别人进行代码review


1、新建分支

# 获取主干最新代码
$ git checkout master
$ git pull

# 新建一个开发分支ccy
$ git checkout -b ccy

2、提交分支commit

$ git add --all
$ git status

# verbose参数会列出 diff 的结果
$ git commit --verbose


3、撰写提交信息(示例)

Present-tense summary under 50 characters

* More information about commit (under 72 characters).
* More information about commit (under 72 characters).

http://project.management-system.com/ticket/123

第一行是不超过50个字的提要,然后空一行,罗列出改动原因、主要变动、以及需要注意的问题。最后,提供对应的网址(比如Bug ticket)。


4、与主干同步

$ git fetch origin
$ git rebase origin/master


5、合并commit

分支开发完成后,很可能有一堆commit,但是合并到主干的时候,往往希望只有一个(或最多两三个)commit,这样不仅清晰,也容易管理。

# git rebase命令的i参数表示互动(interactive),这时git会打开一个互动界面,进行下一步操作。
$ git rebase -i origin/master

上面的互动界面,先列出当前分支最新的n个commit(越下面越新)。每个commit前面有一个操作命令,默认是pick,表示该行commit被选中,要进行rebase操作。

        pick:正常选中
        reword:选中,并且修改提交信息;
        edit:选中,rebase时会暂停,允许你修改这个commit(参考这里)
        squash:选中,会将当前commit与上一个commit合并
        fixup:与squash相同,但不会保存当前commit的提交信息
        exec:执行其他shell命令

上面这6个命令当中,squash和fixup可以用来合并commit。先把需要合并的commit前面的动词,改成squash(或者s)。


6、推送到远程仓库

合并commit后,就可以推送当前分支到远程仓库了。

# git push命令要加上force参数,因为rebase以后,分支历史改变了,跟远程分支不一定兼容,有可能要强行推送。
$ git push --force origin ccy


7、发出Pull Request

提交到远程仓库以后,就可以发出 Pull Request 到master分支,然后请求别人进行代码review,确认可以合并到master。