Git使用学习总结

git的组成

git有工作区(workspace)、暂存区(index)、本地仓库(local repository),远程仓库(remote repository).远程仓库为我们保存一份代码拷贝,如github,而工作区、暂存区和本地仓库都在本地,这就是为什么没有网络我们也照样使用git提交(commit)代码更新,因为提交仅是提交到本地仓库,待有网络之后可以再推送(push)到远程仓库。

正如上图所示,git fetch是将远程仓库的更新获取到本地仓库,不影响其他区域。而git pull则是一次性将远程仓库的代码更新到工作区(同时也会更新本地仓库)。

通常来说,git fetch和merge与git pull的区别已经很明显了,但是如果想再了解下git是如何操作的,则需要我们了解下分支这个git的强大特性,

我们用 (远程仓库名)/(分支名) 这样的形式表示远程分支。比如我们想看看上次同 origin 仓库通讯时 master 分支的样子,就应该查看 origin/master 分支。如果你和同伴一起修复某个问题,但他们先推送了一个 iss53 分支到远程仓库,虽然你可能也有一个本地的 iss53 分支,但指向服务器上最新更新的却应该是 origin/iss53 分支。

将下载(fetch)和合并(merge)放到一个命令里的另外一个弊端是,你的本地工作目录在未经确认的情况下就会被远程分支更新。

单独进行下载和合并是一个好的做法,你可以先看看区别(diff),然后再决定是否和本地代码合并。而且分开来做,可以清晰的区别开本地分支和远程分支,方便选择使用。所以尽量少用git pull,多用git fetch和merge。

 

常用命令

提交代码,要先放入缓存区 ,再去提交 到 本地 仓库,最后提交远程仓库,分为三步

1. git add 将改动的代码提交到缓存区

2.git commit 将代码提交到 本地仓库

3. git push 将代码 由本地仓库 同步到 远程仓库

4.还原代码  git reset

5.git pull 远程拉代码相当于svn的更新

6.新建 分支  git branch

7.切换分支 git checkout

8.解决代码冲突   git merge

git clone

克隆一份代码到本地仓库

  获取一个url对应的远程Git repo, 创建一个local copy. 一般的格式是git clone [url],

clone下来的repo会以url最后一个斜线后面的名称命名,创建一个文件夹,如果想要指定特定的名称,可以git clone [url] newname指定.

 

git checkout

git checkout  (branchname)切换到某个分支.

git checkout -b  (branchname): 创建并切换到新的分支.

     这个命令是将git branch newbranch和git checkout newbranch合在一起的结果.

git checkout -d test //删除test分支

checkout branch_1.0/master 切换到branch_1.0/master分支

 

git commit

git commit 提交

git commit -m "This is the message describing the commit" 添加commit信息

git commit -a  

-a是代表add,把所有的change加到git index里然后再commit     git commit -a 会先把所有已经track的文件的改动add进来,然后提交(有点像svn的一次提交,不用先暂存). 对于没有track的文件,还是需要git add一下.

 

git merge

     把一个分支合并进当前的分支.

git merge master //假设当前在test分支上面,把master分支上的修改同步到test分支上

     如果出现冲突,需要手动修改,可以用git merge tool.

git merge tool //调用merge工具

     解决冲突的时候可以用到git diff,解决完之后用git add添加,即表示冲突已经被resolved.

 

在使用git pull代码时,经常会碰到有冲突的情况,提示如下信息:

error: Your local changes to 'c/environ.c' would be overwritten by merge.  Aborting.

Please, commit your changes or stash them before you can merge.

这个意思是说更新下来的内容和本地修改的内容有冲突,先提交你的改变或者先将本地修改暂时存储起来。

 

git fetch

把远程库的代码更新到本地库,相当于是从远程获取最新版本到本地,不会自动merge

    可以git fetch [alias]取某一个远程repo,也可以git fetch --all取到全部repo

 

git pull

  把远程库的代码更新到工作台

     pull == fetch + merge FETCH_HEAD

     git pull会首先执行git fetch,然后执行git merge,把取来的分支的head 合并到当前分支.这个同步操作会产生一个新的commit.    

git pull --rebase origin master //强制把远程库的代码跟新到当前分支上面

 

git push

     push your new branches and data to a remote repository.

     把本地库的修改提交到远程库中

     git push [alias] [branch]

     将会把当前分支merge到alias上的[branch]分支.如果分支已经存在,将会更新,如果不存在,将会添加这个分支.

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

 

git reset     

撤消更改和提交。

 git reset HEAD:

unstage files from index and reset pointer to HEAD

     这个命令用来把不小心add进去的文件从staged状态取出来,可以单独针对某一个文件操作: git reset HEAD - - filename, 这个- - 也可以不加.

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

git reset --soft

     move HEAD to specific commit reference, index and staging are untouched.

git reset --hard

     unstage files AND undo any changes in the working directory since last commit.

     使用git reset —hard HEAD进行reset,即上次提交之后,所有staged的改动和工作目录的改动都会消失,还原到上次提交的状态.

     这里的HEAD可以被写成任何一次提交的SHA-1.

     不带soft和hard参数的git reset,实际上带的是默认参数mixed.

git reset --hard HEAD //撤销本地修改

总结:

     git reset --mixed id,是将git的HEAD变了(也就是提交记录变了),但文件并没有改变,(也就是working tree并没有改变). 取消了commit和add的内容.

     git reset --soft id. 实际上,是git reset –mixed id 后,又做了一次git add.即取消了commit的内容.

     git reset --hard id.是将git的HEAD变了,文件也变了.

按改动范围排序如下:

     soft (commit) < mixed (commit + add) < hard (commit + add + local working)

 

git revert

     反转撤销提交.只要把出错的提交(commit)的名字(reference)作为参数传给命令就可以了.

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

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

 

git add

把本地的修改加到stage中

在提交之前,Git有一个暂存区(staging area),可以放入新添加的文件或者加入新的改动. commit时提交的改动是上一次加入到staging area中的改动,而不是我们disk上的改动. git add 会递归地添加当前工作目录中的所有文件.

 

git init

初始化本地git环境

     在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个repo,并在当前文件夹下创建一个.git文件夹.

 

git status

查看当前分支有哪些修改

查询repo的状态.

     git status -s: -s表示short, -s的输出标记会有两列,第一列是对staging区域而言,第二列是对working目录而言.

 

git diff

      1.不加参数的git diff:

      show diff of unstaged changes.查看当前没有add的内容

     此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容.

     若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用:

          2.git diff --cached.

     show diff of staged changes.查看已经add但是没有commit的内容

     (Git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相同的).

      3.git diff HEAD

     show diff of all staged or unstated changes.上面两个内容的合并

     也即比较woking directory和上次提交之间所有的改动.

 

     如果想看自从某个版本之后都改动了什么,可以用:

      4.git diff [version tag]

     跟log命令一样,diff也可以加上--stat参数来简化输出.

      5.git diff [branchA] [branchB]可以用来比较两个分支.

     它实际上会返回一个由A到B的patch,不是我们想要的结果.

     一般我们想要的结果是两个分支分开以后各自的改动都是什么,是由命令:

     git diff [branchA]…[branchB]给出的.

     实际上它是:git diff $(git merge-base [branchA] [branchB]) [branchB]的结果.

 

git log

查看当前分支上面的日志信息

 

git branch

 git branch可以用来列出分支,创建分支和删除分支.

 git branch: 列出本地所有分支,当前分支会被星号标示出.

git branch (branchname): 创建一个新的分支(当你用这种方式创建分支的时候,分支是基于你的上一次提交建立的). 

git branch -a 查看所有的分支

git branch -r 查看本地所有分支

git branch branch_0.1 master 从主分支master创建branch_0.1分支

git branch -m branch_0.1 branch_1.0 将branch_0.1重命名为branch_1.0 git

 git branch -v可以看见每一个分支的最后一次提交.

 git branch -d (branchname): 删除一个分支.

     删除remote的分支:

     git push (remote-name) :(branch-name): delete a remote branch.

     这个是因为完整的命令形式是:

     git push remote-name local-branch:remote-branch

     而这里local-branch的部分为空,就意味着删除了remote-branch

 

git stash

     把当前的改动压入一个栈.

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

     git stash list会显示这个栈的list.

     git stash apply:取出stash中的上一个项目(stash@{0}),并且应用于当前的工作目录.

     也可以指定别的项目,比如git stash apply stash@{1}.

     如果你在应用stash中项目的同时想要删除它,可以用git stash pop

 

     删除stash中的项目:

     git stash drop: 删除上一个,也可指定参数删除指定的一个项目.

     git stash clear: 删除所有项目.

  • git stash //把未完成的修改缓存到栈容器中
  • git stash list //查看所有的缓存
  • git stash pop //恢复本地分支到缓存状态

 

git remote

     list, add and delete remote repository aliases.

     因为不需要每次都用完整的url,所以Git为每一个remote repo的url都建立一个别名,然后用git remote来管理这个list.

     git remote: 列出remote aliases.

     如果你clone一个project,Git会自动将原来的url添加进来,别名就叫做:origin.

     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不同的存取地址.

 

git rebase

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

     rebase的过程中,也许会出现冲突,Git会停止rebase并让你解决冲突,在解决完冲突之后,用git add去更新这些内容,然后无需执行commit,只需要:

     git rebase --continue就会继续打余下的补丁.

     git rebase --abort将会终止rebase,当前分支将会回到rebase之前的状态.

 

git reset、git revertgit checkout区别和联系

git reset

如果你的更改还没有共享给别人,git reset是撤销这些更改的简单方法

reset命令有3种方式:

--soft – 缓存区和工作目录都不会被改变

--mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响

--hard – 缓存区和工作目录都同步到你指定的提交

把这些标记想成定义git reset操作的作用域就容易理解多了。

 

git checkout

你应该已经非常熟悉提交层面的git checkout。当传入分支名时,可以切换到那个分支。

git checkout hotfix

上面这个命令做的不过是将HEAD移到一个新的分支,然后更新工作目录。因为这可能会覆盖本地的修改,Git强制你提交或者缓存工作目录中的所有更改,不然在checkout的时候这些更改都会丢失。和git reset不一样的是,git checkout没有移动这些分支。

 

 

git revert

Revert撤销一个提交的同时会创建一个新的提交。这是一个安全的方法,因为它不会重写提交历史。

相比git reset,它不会改变现在的提交历史。因此,git revert可以用在公共分支上,git reset应该用在私有分支上。

你也可以把git revert当作撤销已经提交的更改,而git reset HEAD用来撤销没有提交的更改。

就像git checkout 一样,git revert 也有可能会重写文件。所以,Git会在你执行revert之前要求你提交或者缓存你工作目录中的更改。

命令

作用域

常用情景

git reset

提交层面

在私有分支上舍弃一些没有提交的更改

git reset

文件层面

将文件从缓存区中移除

git checkou

提交层面

切换分支或查看旧版本

git checkou

文件层面

舍弃工作目录中的更改

git revert

提交层面

在公共分支上回滚更改

git revert

文件层面

(然而并没有)

 

 

 

 

 

参考文档:
http://blog.csdn.net/xingqingly/article/details/53172720

https://www.cnblogs.com/my--sunshine/p/7093412.html

https://www.cnblogs.com/allanli/p/git_commands.html

https://www.cnblogs.com/yishaochu/p/5402215.html

https://www.cnblogs.com/houpeiyong/p/5890748.html

猜你喜欢

转载自blog.csdn.net/qq877507054/article/details/83381941
今日推荐