Git的介绍及使用
一、配置用户信息:
配置用户名和邮箱:
$ git config --global user.name “chunyu”
$ git config --global user.email 1812928598@qq.com
Git把用户的配置信息放在C:\Users\mis\.gitconfig
二、初始化一个本地的git仓库:
$ git init
跟踪文件:
$git add index.html(跟踪完文件之后,这个文件被存放在暂存区中)
跟踪多个文件:
$ git add *.html 或者 $ git add .
如果文件在暂存区中,此时对文件进行修改,则需要再次将文件添加到暂存区中(add)
如果对本地版本库中的文件进行修改,还没有添加到暂存区,可以查看文件的修改内容: $git diff index.html
把跟踪好的文件提交到版本库中:
$ git commit -m “add a html file” 参数-m的作用:告诉git提交解释信息为add a html file
(提交完文件之后,这个文件就被保存到本地版本库中)
查看提交记录:
$ git log (简洁版:$git log --pretty=oneline)
查看工作区目前的状态:
$ git status
如果多次修改文件,并提交到本地版本库中,如果想回退到上一个版本,则:
Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
$git reset --hard HEAD^//表示回到上个版本
现在回到了老版本,如果现在又想回到新版本,则:
只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个最新版本的commit id是6e1f7...,于是就可以指定回到未来的某个版本:
$git reset --hard 6e1f7
如果命令行窗口被关掉了,则可以使用$git reflog来查看每一次命令(历史命令)。这时找到最新版本的commit di,再使用上个命令就可以回到最新版本了。
撤销修改:$git checkout -- read.txt(就是让这个文件回到最近一次git commit或git add时的状态。)
如果修改完一个文件,并将这个文件保存到暂存区中了,但是这个时候发现修改有问题,这时可以用$git reset HEAD read.txt 命令把暂存区的修改回退到工作区。(这时相当于修改完文件,没有执行add命令,这时可以执行上个命令撤销修改。)
删除文件并提交到版本库:
1、手动删除文件
2、$git rm test.txt
3、$git commit -m “delete the test.txt file”
三、分支管理:
在若干次提交后,其实已经有了一个指向最后一次提交对象的master分支,它在每次提交的时候都会自动向前移动。
创建分支:
$ git branch testing //这会在当前commit对象上新建一个分支指针
Git保存着一个名为HEAD的特别指针,它是一个指向你正在工作中的本地分支的指针,运行git branch命令,只是创建了一个新的分支,但不会自动切换到这个分支中去,所以,现在我们依然是在master分支上工作。
显示当前的分支:
$ git branch
切换到其他分支:
$ git checkout testing //转换到testing分支
($ git checkout -b iss53,相当于以下两条命令的合并:$git branch iss53、$git checkout iss53,创建分支并切换到该分支上)
此时在testing分支上进行修改文件,则现在的状态为:
此时再切换回master分支:$ git checkout master
现在HEAD指针又指向master分支,并把工作目录中的文件换成了master分支所指向的快照内容,也就是说,现在开始所做的改动,将始于一个较老的版本。
在master分支上对文件进行修改,现在项目文件产生了分叉,因为刚才在testing分支上进行了一些修改,然后又回到master分支上进行了另外的修改。这些改变分别孤立在不同的分支里:
四、分支的合并:
当数据结构是以下状态时:
要合并master分支和hotfix分支:首先回到master分支上,$git checkout master,然后合并hotfix分支,$git merge hotfix。此时的状态为:
注意到,合并时出现了fast-forward(快进)提示,由于当前master分支所在的commit是要并入的hotfix分支的直接上游,git只需把指针直接右移。换句话说,如果顺着一个分支走下去可以到达另一个分支,那么git在合并两者时,只会简单的把指针前移,因为没有什么分歧需要解决,所以这个过程叫做快进。
现在hotfix分支和master分支指向相同的提交版本,可以删除hotfix分支:
$git branch -d hotfix
删除没有被合并的分支:
$git branch -D hotfix
当出现以下结构,并且要合并hotfix和iss53分支时,则会出现合并冲突。
合并冲突:两个分支有相同的文件,而且同位置上的内容不相同,如果合并这两个分支,则会产生冲突。这个时候需要手动修改发生冲突的文件。当手动解决冲突后,用$git add test.txt 命令表示文件的冲突已经解决好了,并提交到暂存区。
Bug分支:
软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
功能分支:
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
五、$git stash命令:在当前的分支上工作到一半,还没有提交,需要切换到其他分支上去, 用$git stash命令保存当前的状态,然后就可以切换到其他分支上了。
$git stash list:查看存储点列表
$git stash apply 存储点名称:回到之前存储的状态
六、用SSH生成公钥和私钥:
ssh-keygen -t rsa -C “1812928598@qq.com”
生成的公钥和私钥文件存储在C:\Users\mis\.ssh
公钥为id_rsa.pub,就相当于一把锁,需要放在git服务器上。
私钥为id_rsa,相当于钥匙。
测试SSH公钥是否成功:ssh git@git服务器地址(如:$ ssh git@github.com)
七、克隆远程仓库:
$git clone git@远程仓库url(如:$git clone git@github.com:XiaoKongQi/testhtml009.git)
当从远程库clone时,默认情况下,你只能看到本地的master分支。现在,你要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是用这个命令创建本地dev分支:$git checkout -b dev origin/dev
推送数据到远程仓库:
$git push -u [远程仓库名] [本地推送的分支名]
(如:$git push -u origin master,把本地的master分支推送给了远程仓库,并且在远程仓库origin中创建了一个远程的master分支,远程的master分支和本地master分支关联;如果你推送的是bcy分支:$git push -u origin bcy,那么远程库会自动创建bcy分支,并与本地的bcy分支进行关联)
(如果将本地的test分支推送到远程的master分支上:$git push -u origin test:master)
推送本地仓库的所有分支到远程仓库上去:
$git push -u [远程仓库名] --all
查看本地分支与远程分支的联系:
$git branch -vv
查看当前远程仓库:
$git remote -v
查看远程的分支:
$git branch -r
从远程仓库抓取数据:
$git fetch [远程仓库名](如:$git fetch origin,抓取下来之后,对本地没有任何影响)
在本地分支上,合并远程分支:
$git merge 远程仓库名/分支名
只有在所克隆的服务器上有写权限,并且同一时刻没有其他人在推送数据,这条命令才会如期完成任务。如果你在推送数据前,已经有其他人推送了若干更新,那你的推送操作会被驳回,你必须先把他们的更新抓取到本地,合并到自己的项目中,然后才可以再次推送。
当从远程仓库把别人的更新抓取到本地之后,可以看看在我们推送之前,别人做了什么,
$git log --no-merges origin/master。
$git pull 相当于$git fetch 和$git merge 远程仓库名/分支名,抓取远程数据,并在本地分支上合并远程分支。若合并有冲突,则需手动解决冲突,若合并无冲突,则本地就跟远程数据一样了。
如果本地有一个master分支和远程的origin/master分支没有建立跟踪关联,需要使用$git branch --set-upstream-to=origin/master
查看远程仓库信息:
$git remote show origin
重命名远程仓库名:
$git remote rename 原名 新名
远程仓库的删除:
$git remote rm 远程仓库名
将本地仓库与远程仓库进行关联:
$git remote add origin git@远程服务器地址(如:$git remote add origin git@github.com:michaelliao/learngit.git)(关联之后,一般要将本地master分支与远程master进行关联:$git branch --set-upstream-to=origin/master,在关联master分支之前,先git pull一下,然后再关联master分支。关联之后如果pull代码,如果报错: refusing to merge unrelated histories,就这样pull:$git pull origin master --allow-unrelated-histories)
八、标签:
在Git中打标签非常简单,首先,切换到需要打标签的分支上,然后,敲命令git tag <name>就可以打一个新标签:(默认标签是打在最新提交的commit上的)
$ git tag v1.0
创建带有说明的标签,用-a指定标签名,-m指定说明文字::
$git tag -a v0.1 -m “version 0.1 released” 1094adb
对老版本打标签:
①先找到历史提交的commit id:$git log --pretty=oneline --abbrev-commit
②找到对应的commit id:$git tag v0.9 e27928
查看所有标签:
$git tag
查看标签信息:
$git show v0.9
删除标签:
$git tag -d v0.1
推送某个标签到远程,或者,一次性推送全部尚未推送到远程的本地标签::
$git push origin v1.0,$git push origin --tags
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
$ git tag -d v0.9
然后,从远程删除。删除命令也是push,但是格式如下:
$git push origin :refs/tags/v0.9
九、忽略特殊文件
忽略某些文件时,需要编写.gitignore,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。.gitignore文件要提交到本地版本库中。
在eclipse中使用git:
https://blog.csdn.net/Adelly/article/details/79099772#_Toc480656628