Git基础命令篇

Stella981
• 阅读 717

一、Git介绍

(1)Git是一个开源(Linus Torvalds 为了帮助管理 Linux 内核开发而开发)的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,与常用的版本控制工具 CVS, SVN等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

(2)Git 的工作区、暂存区和版本库:

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

二、安装

Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行。

(1)Windows 上安装 Git

在 Windows 平台上安装 Git 很容易,有个叫做 msysGit 的项目提供了安装包,可以到 GitHub 的页面上下载 exe 安装文件并运行(安装包下载地址:https://gitforwindows.org/

Git基础命令篇

安装成功后,就可以使用命令行的 git 工具(已经自带了 ssh 客户端,右击->"Git Bash")进行Git操作,另外还有一个图形界面的 Git 项目管理工具

(2)其他安装 参见菜鸟教程: http://www.runoob.com/git/git-install-setup.html

三、使用

(1)基本使用

1. git init 可以在任何时候/目录中创建新的 Git 仓库,完全是本地化的:

git init //在目录中创建新的 Git 仓库,缺省情况下 Git 就会为你创建"master"分支

创建完后会在项目中生成“ .git ”这个子目录。 这就是你的 Git 仓库了,所有有关你的此项目的快照数据都存放在这里,eg:

Git基础命令篇

2.git clone 拷贝一个 Git 仓库到本地进行查看修改:

 git clone [url] //默认,Git 会用此 URL 最后一个“/”之后的名称作为本地项目名称,你也可以在该命令后加上你想要的名称: git clone [url] <project name>

eg.:

首先,去coding(较流行的一个Git服务器)随便找个项目,复制Git仓库地址:

Git基础命令篇

然后,到本地计算机右击选择“git clone”:

Git基础命令篇

3.git add 将文件添加到缓存

新项目可以使用  “git add .  ” 命令递归地添加当前工作目录中的所有文件。

4.git status 查看在你上次提交之后是否有修改

git status -s //查看状态, -s表示short,如果不加会详细输出内容
/** git status -s 状态码解析*****************
  A: 你本地新增的文件(服务器上没有).   
  C: 文件的一个新拷贝.   
  D: 你本地删除的文件(服务器上还在).  
  M: 文件的内容或者mode被修改了.    
  R: 文件名被修改了。   
  T: 文件的类型被修改了。   
  U: 文件没有被合并(你需要完成合并才能进行提交)。  
  X: 未知状态(很可能是遇到git的bug了,你可以向git提交bug report)  
  ?:未被git进行管理,可以使用git add file1把file1添加进git能被git所进行管理
  这些状态也会组合出现,eg:
 "AM" :意思是,这个文件在我们将它添加到缓存之后又有改动,改动后我们再执行 git add 命令将其添加到缓存中
 "UU" :
**/

5.git diff 查看执行 git status 的结果的详细信息

git diff 比较工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。git status 显示你上次提交更新后的更改或者写入缓存的改动, 而 git diff 则一行一行地显示这些改动具体是啥:

  • 尚未缓存的改动:git diff
  • 查看已缓存的改动: git diff --cached
  • 查看已缓存的与未缓存的所有改动:git diff HEAD
  • 显示摘要而非整个 diff:git diff --stat

**6.**git commit

 git add 将想要快照的内容写入缓存区, git commit 则将缓存区内容添加到仓库中。

git commit 
git commit -m "<message>" //使用 -m 选项以在命令行中提供提交注释
git commit -a //把unstaged的文件变成staged(不包括新建(untracked)的文件)然后commit,一般还是推荐先git add再git commit
git commit -am "<message>"//或 git commit –a –m "<message>",相当于git add . + git commit –m "<message>"合并使用
git commit --amend //增补提交,会使用与当前提交节点相同的父节点进行一次新的提交,旧的提交将会被取消.

Git 为你的每一个提交都记录你的名字与电子邮箱地址,所以第一步需要配置用户名和邮箱地址

7.git reset HEAD  取消之前 git add 已缓存的内容,但不包含在下一提交快照中的缓存。

HEAD关键字指的是当前分支最末梢最新的一个提交,也就是版本库中该分支上的最新版本.

git reset HEAD //把add进去的文件从staged状态取出来,可以单独针对某一个文件操作: git reset HEAD <filename>
git reset --mixed HEAD//--mixed是缺省参数,是将git的HEAD变了(也就是提交记录变了),但文件目录并没有改变, 取消了commit和add的内容.
git reset --soft HEAD// 实际上,是git reset –mixed id 后,又做了一次git add.即取消了commit的内容.
git reset --hard HEAD//是将git的HEAD变了,文件也变了.
     按改动范围排序如下:
     soft (commit) < mixed (commit + add) < hard (commit + add + local working)

8.git revert HEAD: 撤销最近的一个提交:

  git revert会创建一个反向的新提交,可以通过参数-n来告诉Git先不要提交.

9.git rm 从已跟踪文件清单中移除某个文件:

如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 Changes not staged for commit 的提示。要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交:

git rm <file>
git rm -f <file> //如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f
git rm --cached <file>//仅从跟踪清单中删除,把文件从暂存区域移除但仍保留在当前工作目录中使用
git rm –r * //递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件

10.git mv 命令用于移动或重命名一个文件、目录、软连接:

git mv <file> <new file>

11.git clean是从工作目录中移除没有track的文件:

git clean -d// -d表示同时移除目录
git clean -f// -f表示force,因为在git的配置文件中, clean.requireForce=true,如果不加-f,clean将会拒绝执行.

12.git stash把当前的改动压入一个栈:

git stash将会把当前目录和index中的所有改动(但不包括未track的文件)压入一个栈,然后留给你一个clean的工作状态,即处于上一次最新提交处

git stash list//显示这个栈的list.
git stash apply//取出stash中的上一个项目(stash@{0}),并且应用于当前的工作目录.也可以指定别的项目,如:git stash apply stash@{1}
git stash pop//在应用stash中项目的同时想要删除它
git stash drop// 删除上一个,也可指定参数删除指定的一个项目
git stash clear// 删除所有项目

13.git reflog 对reflog进行管理

reflog是git用来记录引用变化的一种机制,比如记录分支的变化或者是HEAD引用的变化,git会将变化记录到HEAD对应的reflog文件中,其路径为 .git/logs/HEAD, 分支的reflog文件都放在 .git/logs/refs 目录下的子目录中

git reflog//不指定引用的时候,默认列出HEAD的reflog。HEAD@{0}代表HEAD当前的值,HEAD@{3}代表HEAD在3次变化之前的值.

 (2)Git 分支管理

几乎所有版本控制系统都支持分支。使用分支可以从开发主线上分离开来,在不影响主线的同时继续工作。

1.创建分支:

git branch (branchname) //没有参数时,git branch 会列出你在本地的分支。

2.切换分支:

当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。

git checkout (branchname) //该分支存在则切换到分之下否则创建新分支并立即切换到该分支下

3.合并分支:

Git 合并,不仅仅是简单的文件添加、移除的操作, 也会合并修改。你可以多次合并到统一分支, 也可以选择在合并之后直接删除被并入的分支。

git merge (branchname)  //将此分支合并到主分支去
git checkout -b (branchname) //创建并切换到新的分支,相当于git branch newbranch + git checkout newbranch 合并使用
git checkout <filename>//此命令会使用HEAD中的最新内容替换掉你的工作目录中的文件,已添加到暂存区的改动以及新文件都不会受到影响。会删除该文件中所有没有暂存和提交的改动,这个操作是不可逆的

合并出现冲突需要手动去修改它,然后:

git add // 解决了冲突要告诉 Git 文件冲突已经解决
git merge --abort//或者你也可以取消merge

4.删除分支:

git branch -d (branchname)

5.查看分支的最后一次提交:

git branch -v

(3)Git log查看提交日志

Git 最为出色的是它的合并跟踪(merge tracing)能力。使用 git log 命令查看提交历史:

git log
git log --oneline //查看历史记录的简洁的版本
git log --reverse --oneline //逆向显示所有日志
git log --oneline --number //显示number条,每条log只显示一行
git log --oneline --graph //图形化显示分支合并历史
git log branchname// 显示特定分支的log
git log --oneline branch1 ^branch2//查看在分支1不在分支2中的log,^表示排除这个分支
git log --decorate//会显示出tag信息
git log --grep //根据commit信息过滤log: git log --grep=keywords 默认情况下, git log --grep --author是OR的关系,即满足一条即被返回,如果你想让它们是AND的关系,可以加上--all-match的option
git log -S: filter by introduced diff ,如: git log -SmethodName (注意S和后面的词之间没有等号分隔).
git log -p//每一个提交都是一个快照(snapshot),Git会把每次提交的diff计算出来,作为一个patch显示给你看,另一种方法是git show [SHA].
git log --stat//同样是用来看改动的相对信息的,--stat比-p的输出更简单一些.
//--no-merges可以将merge的commits排除在外.

用 --graph 选项,开启了拓扑图选项,可以更清楚明了地查看历史中什么时候出现了分支、合并,eg.:

$ git log --oneline --graph
*   88afe0e Merge branch 'change_site'
|\  
| * d7e7346 changed the site
* | 14b4dca 新增加一行
|/  
* 556f0a0 removed test2.txt
* 2e082b7 add test2.txt
* 048598f add test.txt
* 85fc7e7 test comment from runoob.com

如果只想查找指定用户的提交日志可以使用命令:git log --author ,eg.:

$ git log --author=Linus --oneline -5 //找 Git 源码中 Linus 提交的部分
81b50f3 Move 'builtin-*' into a 'builtin/' subdirectory
3bb7256 make "index-pack" a built-in
377d027 make "git pack-redundant" a built-in
b532581 make "git unpack-file" a built-in
112dd51 make "mktag" a built-in

如果你要指定日期,可以执行几个选项:--since 和 --before, --until 和 --after,eg.:

$ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges //看 Git 项目中三周前且在四月十八日之后的所有提交,我可以执行这个, --no-merges 选项以隐藏合并提交
5469e2d Git 1.7.1-rc2
d43427d Documentation/remote-helpers: Fix typos and improve language
272a36b Fixup: Second argument may be any arbitrary string
b6c8d2d Documentation/remote-helpers: Add invocation section
5ce4f4e Documentation/urls: Rewrite to accomodate transport::address
00b84e9 Documentation/remote-helpers: Rewrite description
03aa87e Documentation: Describe other situations where -z affects git diff
77bc694 rebase-interactive: silence warning when no commits rewritten
636db2c t3301: add tests to use --format="%N"

(4)Git 标签

1.如果你希望永远记住重要的阶段那个特别的提交快照,你可以使用 git tag 给它打上标签,eg.:

git tag -a v1.0 //给最新一次提交打上(HEAD)"v1.0"的标签,-a 选项意为"创建一个带注解的标签",不用 -a 选项也可以执行的,但它不会记录这标签是啥时候打的,谁打的,也不会让你添加个标签的注解。推荐创建带注解的标签

2.查看标签:

$ git tag//查看所有标签
v0.9
v1.0

3.如果我们忘了给某个提交打标签,又将它发布了,我们可以给它追加标签,eg.:

$ git tag -a v0.9 85fc7e7 //给发布提交的 85fc7e7 追加标签
$ git log --oneline --decorate --graph
*   88afe0e (HEAD, tag: v1.0, master) Merge branch 'change_site'
|\  
| * d7e7346 (change_site) changed the site
* | 14b4dca 新增加一行
|/  
* 556f0a0 removed test2.txt
* 2e082b7 add test2.txt
* 048598f add test.txt
* 85fc7e7 (tag: v0.9) test comment from runoob.com

4.指定标签信息:

git tag -a <tagname> -m "<message>"

5.PGP签名标签:

git tag -s <tagname> -m "<message>"

6.删除标签:

git tag -d <tagname>

7.查看某个标签版本所修改的内容:

git show <tagname>

四、Git仓库

Git 并不像 SVN 那样有个中心服务器。 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作。 你就需要将数据放到一台其他开发人员能够连接的服务器上。

(1)添加远程库

要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,命令格式如下:

git remote add [shortname] [url]

目前流行的Git仓库有很多,使用最多的有:GitHub、Coding(兼具SVN、Git)。具体的使用如同普通的软件一样很简单,可以直接上手

(2)使用Git仓库

1.查看当前的远程库

因为不需要每次都用完整的url,所以Git为每一个remote repo的url都建立一个别名,然后用git remote来管理这个list,如果你clone一个project,Git会自动将原来的url添加进来,别名就叫做:origin

git remote// 列出remote aliases.
git remote -v//查看每一个别名对应的实际url.
git remote add [alias] [url]// 添加一个新的remote repo.
git remote rm [alias]// 删除一个存在的remote alias.
git remote rename [old-alias] [new-alias]//重命名
git remote set-url [alias] [url]//更新url, 可以加上—push和-fetch参数,为同一个别名set不同的存取地址.

2.提取远程仓库

git fetch //取所有你本地没有的数据,取下来的分支(remote branches)和本地分支一样(可以看diff、log、merge),但是Git不允许你checkout到它们
git fetch [alias]//取某一个远程repo
git fetch --all//取到全部repo

3.推送到远程仓库

① 从远程仓库下载新分支与数据

 如果有多个人向同一个remote repo push代码, Git会首先在你试图push的分支上运行git log,检查它的历史中是否能看到server上的branch现在的tip,如果本地历史中不能看到server的tip,说明本地的代码不是最新的,Git会拒绝你的push,让你先fetch,merge,之后再push,这样就保证了所有人的改动都会被考虑进来

git push [alias] [branch] // 把当前分支merge到alias上的[branch]分支,如果分支已经存在,将会更新,如果不存在,将会添加这个分支.
git push (remote-name) (branch-name) //(local-branch)缺省就意味着删除remote-branch

② git merge 从远端仓库提取数据并尝试合并到当前分支

git merge [alias]/[branch] 

git rebase不会产生合并的提交,它会将本地的所有提交临时保存为补丁(patch)放在”.git/rebase”目录中,然后将当前分支更新到最新的分支尖端、最后把保存的补丁应用到分支上。

//rebase的过程中,也许会出现冲突,Git会停止rebase并让你解决冲突,在解决完冲突之后,用git add去更新这些内容,然后无需执行commit,只需要: 
git rebase --continue//就会继续打余下的补丁
git rebase --abort//终止rebase,当前分支将会回到rebase之前的状态

4.删除远程仓库

git remote rm [别名]

5.git pull 缺省参数== fetch + merge FETCH_HEAD

git pull//== git pull --merge,先执行git fetch,然后执行git merge把取来的分支的head merge到当前分支产生一个新的commit   
git pull --rebase//先执行git fetch,然后执行git rebase

(3)自己搭建Git 仓库

你也可以搭建属于自己的Git服务器,参见:http://www.runoob.com/git/git-server.html

1、安装Git

$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel $ yum install git

创建一个git用户组和用户,用来运行git服务:

$ groupadd git $ useradd git -g git

2、创建证书登录

收集所有需要登录的用户的公钥,公钥位于id_rsa.pub文件中,把我们的公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。如果没有该文件创建它:

$ cd /home/git/ $ mkdir .ssh $ chmod 755 .ssh $ touch .ssh/authorized_keys $ chmod 644 .ssh/authorized_keys

3、初始化Git仓库

选定一个目录作为Git仓库:

$ cd /home $ mkdir gitrepo $ chown git:git gitrepo/ $ cd gitrepo

$ git init --bare runoob.git Initialized empty Git repository in /home/gitrepo/runoob.git/

以上命令Git创建一个空仓库,服务器上的Git仓库通常都以.git结尾。然后,把仓库所属用户改为git:

$ chown -R git:git runoob.git

4、克隆仓库

$ git clone git@192.168.45.4:/home/gitrepo/runoob.git Cloning into 'runoob'... warning: You appear to have cloned an empty repository. Checking connectivity... done.

五、目前主流的代码编译器都已集成了版本控制系统

以webstorm为例,安装了git后就可以使用:

分别是:拉取、提交

Git基础命令篇

branch(分支)管理

Git基础命令篇

右击项目名,就能看到git选项

Git基础命令篇

ps:webstorm自身的local history可以看到编译日志(项目运行后存放在webstorm生成的“.idea文件夹”)。右击项目名,就能看到local history选项

Git基础命令篇

打开后可以看到每次修改的记录,你还可以revert还原代码,如下:

Git基础命令篇

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Github管理自己的代码
一、名词解释GitGit是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是LinusTorvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git与常用的版本控制工具CVS,Subversion等不同,它采用了分布式版本库的方式,不必服务器端软件支持。Github
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
CentOS下使用yum安装Git具体步骤
Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。Git是LinusTorvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git是用于Linux内核开发的版本控制工具。与常用的CVS,Subversion等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
胖大海 胖大海
2年前
Git 原理
简介Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是LinusTorvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git与常用的版本控制工具CVS,
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这