Git的常用命令使用

来源:互联网 发布:ios 跳转到淘宝客户端 编辑:程序博客网 时间:2024/06/06 16:31

Git的常用命令使用

            俗话说工欲善其事,必先利其器,那么开源领域什么是利器呢?当然有很多种,不过开始第一步我想应该还是如何去管理使用开源软件,这个就需要用到这个Git了。

本文主要内容是参考链接中廖老师的教程,主要进行了压缩整理,便于快速学习。

1    创建版本库

创建项目目录

#mkdir projectgit

#cd projectgit

通过git init命令把这个目录变成Git可以管理的仓库:

#git init

目录下会多了一个.git的目录,这个目录是Git来跟踪管理版本库的,是Git的版本库。不要手动修改这个目录里面的文件,改乱了Git仓库就给破坏了。

1.1    创建readme

编写一个readme.txt文件

内容随机写:readme

git addreadme.txt

用命令git commit告诉Git,把文件提交到仓库:

$ git commit -m"wrote a readme file"

git status命令看看结果,时刻掌握仓库当前的状态。

 

2    提交修改

提交修改和提交新文件是一样的两步,第一步是gitadd

在执行第二步git commit之前,我们再运行gitstatus看看当前仓库的状态:

2.1.1    查看修改

可以通过git diff查看文件修改,知道了对文件作了什么修改后,再把它提交到仓库。

3    版本回退

Git可以“保存一个快照”,这个快照在Git中被称为commit。一旦把文件改乱或误删,可以从最近的commit恢复。

版本控制系统用git log命令查看

如果感觉输出信息太多,可以试试加上--pretty=oneline参数

其中第一列是commit id(版本号)

用HEAD表示当前版本,也就是最新的提交版本号,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上10个版本可以写成HEAD~100。

那么到底如何回退呢?可以使用gitreset命令,回退到上个版本命令如下:

git reset命令:

#git reset--hard HEAD^

PS:回退之前最好要记一下新的版本号,以防止可能还要前滚,前滚是需要版本号的,而回退之后是看不到之前新的版本号了。不过日志里面是有记录的,Git提供了一个命令gitreflog用来记录

HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。

回退前可以用git log可以查看提交历史,以便确定要回退到哪个版本。

再可以用git reflog查看命令历史,以便确定前滚到哪个版本。

4    Git库知识深入

我们在使用git init命令后会生成一个隐藏目录.git,这个是git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,自动创建的第一个分支master,指向master的一个指针叫HEAD。

把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

创建Git版本库时,Git自动创建了唯一一个master分支, gitcommit就是往master分支上提交更改。

提交commit后,又没有对工作区做任何修改,那么工作区就是“干净”的:

5    撤销修改

如果已经将修改的文件添加到了stage区,但是你发现需要撤销后如何操作呢?

git checkout -- filename可以丢弃工作区的修改:

例如:

先修改一个文件,然后git addfile.txt放入到stage区。

然后执行git status发现已经修改

最后执行git checkout --file.txt,撤销

注意:命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令

撤销分为两种情况:

l   一种是修改后还没有被放到暂存区,撤销修改就回到和版本库一模一样的状态;

l   一种是已经添加到暂存区后,又作了修改,撤销修改就回到添加到暂存区后的状态。

此外用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区。gitreset命令既可以回退版本,也可以把暂存区的修改回退到工作区。

l   如果改乱了工作区文件的内容,直接丢弃工作区的修改用命令git checkout -- file。

l   如果不但改乱了工作区文件的内容,还添加到了暂存区时,先用命令git reset HEAD file,回到上个场景,再接着执行上个场景操作。

6    删除文件

操作系统里面直接使用rm命令即可。

从版本库中删除该文件,先用命令git rm删掉,然后gitcommit

如果删错了(被操作系统命令删除,如果是git命令删除的,那么只能回滚了),那么可以把误删的文件恢复到最新版本

$ git checkout-- test.txt

7    远程仓库

以上都是本地仓库管理,还有远程仓库管理。远程仓库管理就是把库存放在远程,远程就是通过网络链接,可以直接理解成github这个库托管。不过要注册一个GitHub账号,就可以免费获得Git远程仓库。

7.1     先设置账号权限

l   创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已有,直接跳到下一步。Windows下打开Git Bash,创建SSH Key:$ ssh-keygen -t rsa -C "youremail@example.com"

l   在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSHKey的秘钥对,id_rsa是私钥,不能泄露,id_rsa.pub是公钥,可以告诉任何人。

l   登陆GitHub,打开“Accountsettings”,“SSH Keys”页面:点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。GitHub需要识别出你推送的,而不是别人冒充的。

7.2    添加远程库

在本地的仓库下运行命令:

$ git remote add origin git@github.com:test/git.git

git add .

git commit

git push -u origin master

其中远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改.

7.3    克隆远程库

要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。

Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

#git clone https://github.com/test/test-hook

8    分支管理

 

创建sub分支,切换到sub分支:

$ git checkout -b sub

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

$ git branch sub

$ git checkout sub

用git branch命令查看当前分支:

$ git branch

git branch命令会列出所有分支,当前分支前面会标一个*号。

sub分支的工作完成,就可以切换回master分支:

$git checkout master

如果分支中的文件修改或添加,没有合入到master,那么在切换回master后是看不到修改的。

8.1    合入分支

把sub分支的工作成果合并到master分支上:

$ gitmerge sub

Updating 4d2b1df..f876c7a

Fast-forward

…….

git merge命令用于合并指定分支到当前分支。和sub分支的最新提交是完全一样的。

输出信息中有Fast-forward信息,说明这次合并是“快进模式”,也就是直接把master指向sub的当前提交,合并速度非常快。不过不是每次合并都能Fast-forward。

合并完成后,就可以放心地删除sub分支了:

$ gitbranch -d sub

查看branch,就只剩下master分支了。

如要要删除为合并的分支需要执行如下:

git branch -Dfeature-vulcan。

 

8.2    分支冲突

例如在分支上该了某个文件一行并提交,然后切回master也改了同一行并提交。如果这个时候要进行合并就会出现冲突,这个场景并不少见,这样的话该如何处理呢?

这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但合并就可能会有冲突。出现如下报错。

CONFLICT (content): Merge conflict in xxx.txt

Automatic merge failed; fix conflicts andthen commit the result.

git status也可以显示冲突的文件,也可以直接查看冲突的文件,其中用<<<<<<<,=======,>>>>>>>标记出不同分支的内容

            手动修改后,继续执行gitadd和git commit功能来提交。

可以使用

$git log --graph --pretty=oneline--abbrev-commit

来查看。

用git log --graph命令可以看到分支合并图。

8.3    分支管理策略

合并分支时, Git尽可能的使用Fastforward模式,但会删除分支后,会丢掉分支信息。

可以--no-ff方式强制禁用Fastforward模式,这样Git就会在merge时生成一个新的commit,就能从分支历史上就可以看出分支信息。

$ git merge--no-ff -m "merge with no-ff" sub

master分支应该是非常稳定的,仅用来发布新版本,平时不能在上面干活;

            每个新特性都可以单独拉个分支来开发。

8.4    BUG分支临时存储

存在这样一种场景,我们正在一个分支上干活,活也干了一半了,但是还不能合入。这个时候有个主线master的BUG要紧急处理,那么怎么处理?

            这场景可以用到gitstash功能了。

可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作

$gitstash

Saved working directory and index state WIP on master: 1a54dad merge

HEAD is now at 1a54dad merge

执行完后查看git status发现是干净的了。

然后切到master,拉个分支用来修复bug用。

            修复完后合入到master,删掉修复用的bug分支。

            接着我们切到之前工作的分支,

执行$git stash list 查看工作现场的保存。

恢复有两个办法:

l   用git stashapply恢复,git stash drop来删除stach;

l   用git stashpop,恢复的同时把stash内容也删了

再用git stash list查看,就看不到任何stash内容,现在之前的工作现场又恢复了。

如果工作现场比较多,可以执行来恢复指定的现场。

git stash applystash@{0}

git stash dropstash@{0}

8.5    多人协作

远程仓库的默认名称是origin。

要查看远程库的信息,用git remote

用git remote -v显示更详细的信息:

显示可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。

8.5.1 推送分支

推送分支就是把该分支上的所有本地提交推送到远程库。要指定本地分支, Git就会把该分支推送到远程库对应的远程分支上:

$ git pushorigin master

如果要推送其他分支,比如sub,就改成:

$ git pushorigin sub

并一定要把本地分支往远程推送,一般master分支是主分支,因此要时刻与远程同步;dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步

8.5.2 抓取分支

从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支.

抓取分支如下,本地新建的分支如果不推送到远程,对其他人就是不可见的;:

git checkout -bdev origin/dev

修改完后推送到远程仓库

$ git pushorigin dev

最新提交如果有冲突,如下:

    hint: (e.g., 'git pull ...')before pushing again.

hint: See the 'Note about fast-forwards' in 'git push --help' for details.

解决办法也很简单,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送

#git pull

git命令出错后会有比较好的提升修改方法。

如果git pull失败了,可能原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:

$ git branch--set-upstream dev origin/dev

具体看提示说明。

在远程仓库管理中,主要有这些命令gitremote –v查看远程库;

从本地推送分支,使用git pushorigin branch-name,如果推送失败,先用git pull抓取远程的新提交;使用git checkout -b branch-name origin/branch-name在本地创建和远程分支对应的分支,本地和远程分支的名称尽量一致以免混淆;使用git branch --set-upstream branch-name origin/branch-name建立本地分支和远程分支的关联;如果有冲突,使用git pull抓取分之后先处理冲突。

9    关于标签

Git中打标签很方便,先切换到需要打标签的分支上

命令git tag<name>就可以打一个新标签:

默认标签是打在最新提交的commit上的。如果要在上周一的标签没有打,怎么办?

找到历史提交的commit id,然后打上就可以了

$ git log--pretty=oneline --abbrev-commit

$ git tagtesttag [commitid]

git tag命令可以列出标签。然后可以用git show <tagname>查看标签信息:

可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

$ git tag -av0.1 -m "version XX released" [commitid]

可以通过-s用私钥签名一个标签:

$ git tag -sv0.2 -m "signed version xxreleased" [commitid]

须先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错。

9.1    删除标签

删除标签命令如下:

$ git tag -dv0.1

如果从远程删除。删除命令也是push,但是格式如下:

$ git pushorigin :refs/tags/[tagname]

 

9.2    推送标签

创建的标签都只存储在本地,不会自动推送到远程。打错的标签可以在本地安全删除。

如果要推送某个标签到远程,使用命令gitpush origin <tagname>:

$ git pushorigin tagname

或者,一次性推送全部尚未推送到远程的本地标签:

$ git pushorigin --tags

10    参与开源项目

在github中找到一个开源项目,点“Fork”就在自己的账号下克隆了一个仓库,然后,从自己的账号下clone,这样你才能推送修改。如果希望的官方库能接受自己的修改,可以在GitHub上发起一个pull request,不过注意的是别人不一定接受。

11    配置git

命令输出看起来更醒目:

$ git config --global color.ui true

11.1 忽略特殊文件

有时候必须把某些文件放到Git工作目录中,但又不能提交它们。如何忽略他们?

在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去, 注意是文件名,git就会自动忽略这些文件。

GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。

忽略文件的原则是:

l   忽略操作系统自动生成的文件,比如缩略图等;

l   忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;

l   忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

如果想添加一个文件到Git,但添加不了,原因可能是这个文件被.gitignore忽略了,可以用-f强制添加到Git。

如果.gitignore写得有问题,可以用gitcheck-ignore命令检查。

$ gitcheck-ignore -v hello.class

.gitignore文件本身要放到版本库里,可以对.gitignore做版本管理.

11.2 配置别名

$ git config--global alias.st status

$ git config--global alias.co checkout

$ git config--global alias.ci commit

$ git config--global alias.br branch

--global参数是全局参数

配置一个git last,让其显示最后一次提交信息:

$ git config--global alias.last 'log -1'

可以把查看日志修改成如下:

git config--global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset-%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'--abbrev-commit"

这样只要输入 git lg就会出现详细的日志提交信息。

查看git配置:

$git config -l

加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。配置文件放在.git/config文件中:

别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。

而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig

 

12    参考链接

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

https://git-scm.com/

 


原创粉丝点击