Git 简单使用学习

来源:互联网 发布:linux 如何查看用户数 编辑:程序博客网 时间:2024/06/05 15:05

这个博客只为学习git的记录,参考学习的文章:
1. 廖雪峰的Git教程
2. Git 常用命令详解


Git 命令详解

版本控制工具所公有的命令:
1. git pull:从其他的版本库(既可以是远程的也可以是本地的)将代码更新到本地,例如:git pull origin master就是将origin这个版本库的代码更新到本地的master主枝
2. git add:是将当前更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示记入了版本历史中,这也是提交之前所需要执行的一步,例如git add app/model/user.rb就会增加 app/model/user.rb 文件到Git的索引中
3. git rm:从当前的工作空间中和索引中删除文件,例如git rm app/model/user.rb
4. git commit:提交当前工作空间的修改内容,例如git commit -m story #3, add user model,提交的时候必须用-m来输入一条提交信息
5. git push:将本地commit的代码更新到远程版本库中,例如git push origin就会将本地的代码更新到名为orgin的远程版本库中
6. git log:查看历史日志
7. git revert:还原一个版本的修改,必须提供一个具体的Git版本号,例如’git revert bbaf6fb5060b4875b18ff9ff637ce118256d6f20’,Git的版本号都是生成的一个哈希值

Git独有的一些命令:
8. git branch:对分支的增、删、查等操作,例如git branch new_branch会从当前的工作版本创建一个叫做new_branch的新分支,git branch -D new_branch就会强制删除叫做new_branch的分支,git branch就会列出本地所有的分支
9. git checkout:Git的checkout有两个作用,其一是在不同的branch之间进行切换,例如git checkout new_branch就会切换到new_branch的分支上去;另一个功能是还原代码的作用,例如git checkout app/model/user.rb就会将user.rb文件从上一个已提交的版本中更新回来,未提交的内容全部会回滚
10. git rebase:用下面两幅图解释会比较清楚一些,rebase命令执行后,实际上是将分支点从C移到了G,这样分支也就具有了从C到G的功能
11. git reset:将当前的工作目录完全回滚到指定的版本号,假设如下图,我们有A-G五次提交的版本,其中C的版本号是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我们执行了git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20那么结果就只剩下了A-C三个提交的版本
12. git stash:将当前未提交的工作存入Git工作栈中,时机成熟的时候再应用回来,这里暂时提一下这个命令的用法,后面在技巧篇会重点讲解
13. git config:利用这个命令可以新增、更改Git的各种设置,例如git config branch.master.remote origin就将master的远程版本库设置为别名叫做origin版本库,后面在技巧篇会利用这个命令个性化设置你的Git,为你打造独一无二的 Git
14. git tag:可以将某个具体的版本打上一个标签,这样你就不需要记忆复杂的版本号哈希值了,例如你可以使用git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20来标记这个被你还原的版本,那么以后你想查看该版本时,就可以使用 revert_version标签名,而不是哈希值了

Git 之所以能够提供方便的本地分支等特性,是与它的文件存储机制有关的。Git存储版本控制信息时使用它自己定义的一套文件系统存储机制,在代码根目录下有一个.git文件夹。

$ ls .git/branches  COMMIT_EDITMSG  config  description  HEAD  hooks  index  info  logs  objects  ORIG_HEAD  refs

有几个比较重要的文件和目录需要解释一下:HEAD文件存放根节点的信息,其实目录结构就表示一个树型结构,Git采用这种树形结构来存储版本信息,那么HEAD就表示根;refs目录存储了你在当前版本控制目录下的各种不同引用(引用指的是你本地和远程所用到的各个树分支的信息),它有heads、remotes、stash、tags四个子目录,分别存储对不同的根、远程版本库、Git栈和标签的四种引用,你可以通过命令’git show-ref’更清晰地查看引用信息;logs目录根据不同的引用存储了日志信息。因此,Git只需要代码根目录下的这一个.git目录就可以记录完整的版本控制信息,而不是像SVN那样根目录和子目录下都有.svn目录。那么下面就来看一下Git与SVN的区别吧

创建一个版本库 git init

第一步,选择一个合适的地方,创建一个空目录

$ mkdir learngit$ cd learngit

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

$ git initInitialized empty Git repository in /home/users/huangxue/learngit/.git/

ls -ah 命令可以看见.git 目录

把文件添加到版本库 git add + git commit

第一步,用命令git add告诉Git,把文件添加到仓库:

$ git add readme.txt

执行上面的命令,没有任何显示,这就对了。

$ git status# On branch master## Initial commit## Changes to be committed:#   (use "git rm --cached <file>..." to unstage)##       new file:   readme.txt#

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

$ git commit -m "wrote a readme file"*** Please tell me who you are.Run  git config --global user.email "you@example.com"  git config --global user.name "Your Name"to set your account's default identity.Omit --global to set the identity only in this repository.fatal: empty ident name (for <huangxue@dl1.(none)>) not allowed

出现以上错误提示 :git未设置用户信息(empty ident name)
解决方法:设置 user.email 和 user.name 即可。(参考)

$git config --global user.name "cherie"  $git config --global user.email "xxx@xxx.com" 

重新提交commit

$ git commit -m "wrote a readme file"[master (root-commit) 50829b7] wrote a readme file 1 file changed, 2 insertions(+) create mode 100644 readme.txt

查看工作区的状态 git status

修改 readme.txt 的内容,使用git status命令查看工作区的状态

$ vim readme.txt$ git status# On branch master# Changes not staged for commit:#   (use "git add <file>..." to update what will be committed)#   (use "git checkout -- <file>..." to discard changes in working directory)##       modified:   readme.txt#no changes added to commit (use "git add" and/or "git commit -a")

查看工作区的修改内容 git diff

可以看到git status告诉你有文件被修改过,用git diff可以查看修改内容。

$ git diff readme.txtdiff --git a/readme.txt b/readme.txtindex 46d49bf..9247db6 100644--- a/readme.txt+++ b/readme.txt@@ -1,2 +1,2 @@-Git is a version control system.+Git is a distributed version control system. Git is free software.

查看提交历史 git log

git log命令显示从最近到最远的提交日志,可以告诉我们历史记录,不能察看已经删除了的commit记录

$ git logcommit f8cd540b86cfb5b9b21a1a5bd0d2f20c56823b4fAuthor: cherie <xxx@qq.com>Date:   Thu Nov 2 07:54:01 2017 -0400    add distributedcommit 50829b77a3ae43df944bfbb8bd1f856b379d86d5Author: cherie <xxx@qq.com>Date:   Thu Nov 2 07:52:37 2017 -0400    wrote a readme file

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数

$ git log --pretty=onelinef8cd540b86cfb5b9b21a1a5bd0d2f20c56823b4f add distributed50829b77a3ae43df944bfbb8bd1f856b379d86d5 wrote a readme file

版本回退 git reset

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

现在,我们要把当前版本“add distributed”回退到上一个版本“wrote a readme file”,就可以使用git reset命令:

$ git reset --hard HEAD^HEAD is now at 50829b7 wrote a readme file

如果要回到未来的某个版本,需要找到那个版本的 commit id,比如这里是50829b…(版本号没必要写全,前几位就可以了,Git会自动去找),于是就可以指定恢复版本

$ git reset --hard f8cd540bHEAD is now at f8cd540 add distributed$ git log --pretty=onelinef8cd540b86cfb5b9b21a1a5bd0d2f20c56823b4f add distributed50829b77a3ae43df944bfbb8bd1f856b379d86d5 wrote a readme file

查看所有分支的所有操作记录 git reflog

在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^回退到wrote a readme file版本时,再想恢复到add distributed,就必须找到add distributed的commit id。Git提供了一个命令git reflog用来记录你的每一次命令:

$ git reflogf8cd540 HEAD@{1}: reset: moving to f8cd540bf8cd540 HEAD@{3}: reset: moving to HEAD^f8cd540 HEAD@{5}: commit: add distributed50829b7 HEAD@{6}: commit (initial): wrote a readme file

分支管理

查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d

创建分支 git checkout -b xxx

创建dev分支,然后切换到dev分支:$ git checkout -b devSwitched to a new branch 'dev'

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

$ git branch dev$ git checkout devSwitched to branch 'dev'

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

$ git branch* dev  master

列出所有分支 git branch

git branch命令会列出所有分支,当前分支前面会标一个 * 号。
然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:Creating a new branch is quick.

然后提交:

$ git add readme.txt $ git commit -m "branch test"[dev 4aa1cab] branch test 1 file changed, 1 insertion(+)

切换分支 git checkout xxx

现在,dev分支的工作完成,我们就可以切换回master分支:

$ git checkout masterSwitched to branch 'master'

切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变。

分支合并 git merge

git merge命令用于合并指定分支到当前分支

$ git merge devUpdating 1b1381f..4aa1cabFast-forward readme.txt | 1 + 1 file changed, 1 insertion(+)

删除分支 git merge

$ git branch -d devDeleted branch dev (was 4aa1cab).

删除后,查看branch,就只剩下master分支了:

$ git branch* master
原创粉丝点击