git常用命令总结

一、新建项目
在github.com新建repository。
(使用Git Shell将本地的repository上传到GitHub.com:(所有操作在Git Shell中执行)

1)在本地创建repository,使用cd命令定位到你的项目文件夹(例:c:\projects\MyProject)
2)运行git init,会在目录下生成”.git”隐藏文件夹。
3)将项目下的所有文件添加到git中,运行命令:git add .(“.”表示将目录下所有文件添加到git中)。
4)运行git commit -m “提交备注”。
5)运行git remote add origin https://github.com/(你的库),连接到github.com上你的repository。
6)运行git push origin master,文件就会同步到github.com。

二、向现有添加项目文件并提交
1)可再次运行git add .添加文件到git中,即使有些文件已经存在。
2)运行git commit –m “提交说明” 提交更改。
3)运行 git push origin master提交至github.com。

三、撤消更改
1)git revert HEAD 撤销前一次 commit
2)git revert HEAD^ 撤销前前一次 commit
3)git revert commit (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。
4)恢复某个已修改的文件(撤销未提交的修改):git checkout file-name
5)最后运行 git push origin master提交至github.com

四、删除文件
1)git rm myfile.txt。
2)git commit -m “”。
3)git push origin master。

网址在此:Git教程

1. 集中式vs分布式

我们常用的SVN是集中式的,而git是分布式的。

  1. 集中式:先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。但是致命缺点就是:必须联网,只要断网,大家都不能干活
  2. 分布式:分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库

而且很重要的一点就是,如果集中式的中央服务器挂了,大家就不能干活了(ci或者co),而分布式没有中央服务器,如果个人机器挂了,完全不影响其它人。通常情况下,分布式也有一个“中央服务器”,它只是方便大家查看团队项目的开发进度等,没有它大家照样干活。

2. 版本号

因为SVN是集中式版本控制系统,所以没个版本都存在于服务器,那么版本就是1,2,3这样的连续数字。但是对于git来说,分布式不可能在每台机器上按照1,2,3编号,多个人肯定会重复的。所以,每台机器的每次commit都会算出一个hash值,保证这个值不会重复。这样通过该值就可以区分所有的版本号。

3. 版本回退

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交“ 3628164…882e1e0”(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。比如恢复到上个版本:

  • git reset --hard HEAD^

这时候你用git log查看会发现,原来提交的东西没有了。好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?淡定,只要窗口没关,可以找到最新提交的commit id号(对,就是那一大串东西),就可以使用命令:

  • git reset --HARD 2325252sflsk2523fsdf

恢复到那个版本,当然,你不需要把commit id全部打出来,只需要打前几位,让git能分辨出是哪个版本就行(不能太短,要不然会有重复,git会傻傻分不清楚的)

另外一种情况是:你!找不到!commit id了。。。这可怎么办呢?

  • git reflog

这个命令一试,会发现git记录了每次操作的commit id前几位(git自动记录到能区分每一个版本),还有每次的操作原因。

总结一下就是:

  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset –hard commit_id。
  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

4. git版本回退原理

因为git是用C语言写的,所以版本回退巧妙的使用了指针,具体看图:版本回退

5. git的区域划分

这个阮一峰的一篇文章写的非常清晰:Git分支管理策略

我简单说下:

  • 工作区(Work Directory):本机的工作目录,比如/usr/home/niushuai/git_repo/learngit
  • 版本库(Repository):工作区里有一个隐藏的.git目录,它不属于工作区,而是该项目的git版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

6. 撤销工作区操作

简单的命令:

  • git checkout -- <file_name>

这个命令有2种情况需要考虑:

  1. 一种是file_name自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
  2. 一种是file_name已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
  3. 总之,就是让这个文件回到最近一次git commit或git add时的状态

7. 回退总结

  • 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- <file_name>
  • 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file_name>,就回到了场景1,第二步按场景1操作。
  • 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退(git reset --hard HEAD^),不过前提是没有推送到远程库。
  • 场景4:已经把提交push到远程库了,这时候远程库有了记录。而你知道这个版本有错误。可以回退到某个版本后,将HEAD强制push(git push origin HEAD --force)。

8. git push操作

先在github上创建一个仓库,然后在工作区和远端仓库关联起来。一共2步:

  1. git remote add origin git@github.com:niushuai/learngit.git
  2. git push -u origin master

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。以后再push的时候只需要:

  • git push origin master

9. 分支!

  • 创建分支:git checkout branch_name
  • 创建并切换分支:git checkout -b branch_name
  • 查看所有分支(*为当前所在分支):git branch
  • 切换分支:`git checkout branch_name
  • 合并分支:git merge branch_name
  • 开发完成后删除分支:git branch -d branch_name

10. 查看远端库信息

  • 简单查看:git remote
  • 详细信息:git remote -v

11. pull是别人提交了更新,你push前需要先合并

原来没明白pull是干嘛用的,原来是当多人协同开发冲突时,你提交时候别人可能已经提交了比你新的版本,这时候你必须先pull下来小伙伴的修改合并。然后再看是否有冲突进行进一步的操作。要保证本地的分支和线上的分支链接起来

  1. 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
  2. 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
  3. 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交和自己的版本进行合并;
  4. 如果有冲突,要先处理冲突。
  5. 提交并push到远端

12. 标签

这个也很简单,就是当你release的时候,应该不会用commit id那一大串数字,而是使用version1.2.1这样的标签。是不是和分支很像?但是分支是可以移动的,而标签是针对某个commit版本,所以它是不能移动的。

  • 创建标签:“`git tag v1.0
  • 查看标签:git tag
  • 删除标签:git tag -d v1.0

13. gitignore

有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示“Untracked files …”,有强迫症的童鞋心里肯定不爽。

好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

忽略文件的原则是:

  • 忽略操作系统自动生成的文件,比如缩略图等;
  • 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  • 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

一个例子:

# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

# My configurations:
db.ini
deploy_key_rsa

定义了需要忽略的文件之后,我们需要把.gitignore提交到git。

14. git别名

git也可以使用alias。常用的几个:

  • git config --global alias.ci "commit -a -v"
  • git config --global alias.st "status"
  • git config --global alias.co "checkout"

其中第一个中的-a是这个意思。假如一个文件你已经追踪过了(就是已经add过一次),那么以后你修改后可以在commit的时候用-a来完成本次修改的追踪,免去git add <file_name>这个步骤;而如果这个文件是新建的,没有add过,那么你必须先git add <file_name>之后,以后修改才能在commit的时候用-a。而-v就是详细列出每次的修改,不加的话,每次只有以前commit的id,没有详细的修改之类的。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值