Git常用命令总结

来源:互联网 发布:美国退出qe 知乎 编辑:程序博客网 时间:2024/06/05 19:58

Git是一种分布式版本控制系统,既然提到了分布式,那肯定也有集中式版本控制系统了,常见的集中式版本控制系统有:CVS和SVN。

对于集中式版本控制系统,版本库是放在中央服务器的,如果我们要对版本库中的文件进行操作,必须首先联网,取得服务器中的最新版本,然后在本地电脑操作完毕之后,再将自己的操作内容推到服务器上。中央服务器类似于图书馆,当小明借了图书A(图书A唯一)后,小红必须等到小明归还图书A后,才能借这本书(是不是感觉像编程语言中的同步模式。。)。

对于分布式版本控制系统,并没有中央服务器,在每个人的电脑上都可以有一份完整的版本库,因此,用户并不需要联网,并且彼此的操作是独立的。分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

在总结Git的常用命令之前,首先在github上创建一个仓库,用来测试Git的常用命令。点击进入仓库

本地一个仓库用来对应于github上的仓库。

mkdir git-practice //首先在本地创建一个目录cd git-practice // 进入创建的目录中git init //这个命令主要是将当前目录变为Git可以管理的仓库,在当前目录中会生成一个.git目录,这个目录是用来跟踪管理仓库的,非常重要,不要乱改。。echo "# git-practice" >> README.md //创建一个文件git add README.md //将创建的文件添加到本地仓库中(注:其实这个命令是将所做的修改提交到暂存区中,暂存区概念之后会说)git commit -m "first commit" //将暂存区中的内容提交到仓库中,-m 可以认为对于提交的内容添加一个注释git remote add origin git@github.com:jiangxr/git-practice.git//用于关联本地仓库和github的远程仓库,让我们本地的修改能够提交到远程仓库中git push origin master //将本的修改内容提交到上一个命令关联的远程仓库的master分支上

上面介绍的是最基本的一般性操作,能够将我们修改的内容提交到远程的仓库中。。

工作区和暂存区

这里写图片描述

Git和SVN的一个重要区别是,Git中有暂存区的概念。我们在电脑上直接可以操作的目录就是工作区。而其中的隐藏目录.git其实就相当于版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

常用的命令git add其实就是将所做的修改提交到暂存区中,而git commit其实是将暂存区的所有内容提交到当前分支。上面的一幅图需要理解透彻,大部分命令都是基于这个结构来实现不同的操作。

Git常用命令

添加远程仓库(git remote add)
git remote add origin git@github.com:jiangxr/git-practice.git

从远程仓库克隆(git clone)
git clone git@github.com:jiangxr/git-practice.git

显示工作树的状态(git status)

这里写图片描述
在图片的显示中,bb.txt文件新创建的,已经使用git add命令提交到暂存区中;README.md文件是之前已经有过提交的记录,现在仅仅进行了修改,没有其他操作;aa.txt文件新创建了,没有其他的任何操作。显示了三种文件的不同状态。

显示最近到最远的提交日志(git log)
这里写图片描述

回退版本(git reset [–hard|soft|mixed|merge|keep] [< commit > 或 HEAD])

  • –hard:
    替换引用的指向.引用指向新的提交ID;
    替换暂存区.替换后,暂存区的内容和引用指向的目录树一致;
    替换工作区.替换后,工作区的内容变得和暂存区一致,也和HEAD所指向的目录树内容相同.
  • –soft:
    替换引用的指向.引用指向新的提交ID,即只更改引用的指向,不改变暂存区和工作区.
  • –mixed:
    替换引用的指向.引用指向新的提交ID;
    替换暂存区.替换后,暂存区的内容和引用指向的目录树一致;
    即更改引用的指向及重置暂存区,但是工作区不变.

取消工作区的修改(git checkout – filename)
这个命令的实质是用暂存区的内容覆盖工作区对应文件的内容。

隐藏当前工作现场(git stash)
如果现在正在branch1分支上进行作业,但是作业进行到一半,有一个急需的bug需要修复,但是完成一半的作业还不能进行提交,可以使用git stash命令将完成一半的作业隐藏起来,然后再创建一个分支修复bug。
git stash list // 显示隐藏的修改内容
git stash pop //恢复隐藏的修改内容,stash内容删除
git stash apply //回复隐藏的内容,stash内容不进行删除

标签操作(git tag)

git tag < name >  //新建一个标签,可以指定commit id。git tag //查看所有标签信息git tag push < tagname> //推送一个本地标签git tag push --tags //推送本地所有未推送的标签git tag push origin < tagname> //推送标签到远程git tag -d < tagname> //删除本地的一个标签git tag push :refs/tags/< tagname> //删除远程的标签

显示尚未暂存的目录更新的内容(git diff)
其实就是比较工作目录和暂存区的区别

git diff --cached // 查看已经暂存起来的文件和上次提交的版本之间的差异git diff --cached filename // 查看某个暂存的文件和上一次提交的版本之间的差异git diff 988fasf fadafa //查看两个版本库之间的区别

git rebase
git rebase用于把一个分支的修改合并到当前分支,我们常用的合并分支的命令是git merge。
下面借鉴网上的几张图对比git rebase和git merge之间的区别
如果有两个分支origin(大家把这个理解为分支)和mywork,存在如下的提交情况:
这里写图片描述
origin分支和mywork分支在C2分支分开了,现在想将origin的C3和C4两次提交合并到mywork分支上

git merge的合并情况:
这里写图片描述

git rebase的合并情况:
这里写图片描述

git merge情况是将下拉的内容和你的修改合并,然后创建一个合并的提交;而git rebase是将mywork分支的每次提交取消掉,并把他们保存为临时的补丁,然后将mywork分支更新为最新的origin分支,然后再应用保存的补丁到mywork分支。

git rebase冲突解决

git add * //解决冲突后,更新indexgit rebase --continue //继续rebase操作git rebase --abort  //这个命令用来终止rebase的行动,将rebase的分支跟新为rebase之前的状态。

上面主要简要的介绍一些比较常用的命令,算是平常用的比较多的了