git常用命令

来源:互联网 发布:广西广电网络高清机顶盒 编辑:程序博客网 时间:2024/05/22 06:23

1、初始化仓库


$ git init 初始化

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


$ git add 仓库跟踪

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


$ git commit 提交更新 $ git commit -a 跳过跟踪直接提交暂存

     提交已经被add进来的改动.
     git commit -m “the commit message"
     git commit -a 会先把所有已经track的文件的改动add进来,然后提交(有点像svn的一次提交,不用先暂存). 对于没有track的文件,还是需要git add一下.
     git commit --amend 增补提交. 会使用与当前提交节点相同的父节点进行一次新的提交,旧的提交将会被取消.


$ git clone [url] 克隆仓库文件

获取一个url对应的远程Git repo, 创建一个local copy.
        一般的格式是git clone [url].
        clone下来的repo会以url最后一个斜线后面的名称命名,创建一个文件夹,如果想要指定特定的名称,可以git clone [url] newname指定.

$ git clone [url] [文件夹名] 克隆到自定义名文件夹


$ git status 查看跟踪情况 简单格式 $ git status -s

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


新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M标记。 你可能注意到了 M 有两个可以出现的位置,出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左边的 M 表示该文件被修改了并放入了暂存区。 例如,上面的状态报告显示: README文件在工作区被修改了但是还没有将修改后的文件放入暂存区,lib/simplegit.rb 文件被修改了并将修改后的文件放入了暂存区。 而 Rakefile 在工作区被修改并提交到暂存区后又在工作区中被修改了,所以在暂存区和工作区都有该文件被修改了的记录。

 

$ cat .gitignore 创建一个名为.gitignore 的文件,列出要忽略的文件模式。


$ cat .gitignore

*.[oa]

*~

第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的。 第二行告诉Git 忽略所有以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本。 此外,你可能还需要忽略 log,tmp 或者 pid 目录,以及自动生成的文档等等。要养成一开始就设置好 .gitignore 文件的习惯,以免将来误提交这类无用的文件。

文件 .gitignore 的格式规范如下:

 

要查看尚未暂存的文件更新了哪些部分,不加参数直接输入 git diff

$ git diff

若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --cached 命令。

     不加参数的git diff:
     show diff of unstaged changes.
     此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容.
 
     若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用:
     git diff --cached 命令.
     show diff of staged changes.
     (Git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相同的).
 
     git diff HEAD
     show diff of all staged or unstated changes.
     也即比较woking directory和上次提交之间所有的改动.
 
     如果想看自从某个版本之后都改动了什么,可以用:
     git diff [version tag]
     跟log命令一样,diff也可以加上--stat参数来简化输出.
 
     git diff [branchA] [branchB]可以用来比较两个分支.
     它实际上会返回一个由A到B的patch,不是我们想要的结果.
     一般我们想要的结果是两个分支分开以后各自的改动都是什么,是由命令:
     git diff [branchA]…[branchB]给出的.
     实际上它是:git diff $(git merge-base [branchA] [branchB]) [branchB]的结果.

 

$ git rm 移除文件

$ git rm --cached 移除暂存区文件

     git rm file: 从staging区移除文件,同时也移除出工作目录.
     git rm --cached: 从staging区移除文件,但留在工作目录中.
     git rm --cached从功能上等同于git reset HEAD,清除了缓存区,但不动工作目录树.


$ git mv [文件夹2名字] [文件夹1名字] 将 文件夹1名字 改为 文件夹2名字

git rm - - cached orig; mv orig new; git add new

2、查看提交历史

$ git log

一个常用的选项是 -p,用来显示每次提交的内容差异。 你也可以加上 -2 来仅显示最近两次提交

$ git log -p -2

想看到每次提交的简略的统计信息,你可以使用 --stat 选项

$ git log --stat


show commit history of a branch.
     git log --oneline --number: 每条log只显示一行,显示number条.
     git log --oneline --graph:可以图形化地表示出分支合并历史.
     git log branchname可以显示特定分支的log.
     git log --oneline branch1 ^branch2,可以查看在分支1,却不在分支2中的提交.^表示排除这个分支(Window下可能要给^branch2加上引号).
     git log --decorate会显示出tag信息.
     git log --author=[author name] 可以指定作者的提交历史.
     git log --since --before --until --after 根据提交时间筛选log.
     --no-merges可以将merge的commits排除在外.
     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: show patch introduced at each commit.
     每一个提交都是一个快照(snapshot),Git会把每次提交的diff计算出来,作为一个patch显示给你看.
     另一种方法是git show [SHA].
     git log --stat: show diffstat of changes introduced at each commit.
     同样是用来看改动的相对信息的,--stat比-p的输出更简单一些.

3、撤消操作

有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令尝试重新提交:

$ git commit --amend

你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:

$ git commit -m ‘initial commit’

$ git add forgotten_file

$ git commit --amend

     提交已经被add进来的改动.
     git commit -m “the commit message"
     git commit -a 会先把所有已经track的文件的改动add进来,然后提交(有点像svn的一次提交,不用先暂存). 对于没有track的文件,还是需要git add一下.
     git commit --amend 增补提交. 会使用与当前提交节点相同的父节点进行一次新的提交,旧的提交将会被取消.

4、查看远程仓库

如果想查看你已经配置的远程仓库服务器,可以运行 git remote 命令。 它会列出你指定的每一个远程服务器的简写。 如果你已经克隆了自己的仓库,那么至少应该能看到 origin - 这是 Git 给你克隆的仓库服务器的默认名字:

$ git remote

 

你也可以指定选项 -v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的URL。

$ git remote -v

 

我在之前的章节中已经提到并展示了如何添加远程仓库的示例,不过这里将告诉你如何明确地做到这一点。 运行 gitremote add <shortname> <url> 添加一个新的远程 Git 仓库,同时指定一个你可以轻松引用的简写:

$ git remote add <shortname> <url> 

 

现在你可以在命令行中使用字符串 pb 来代替整个 URL。 例如,如果你想拉取 Paul 的仓库中有但你没有的信息,可以运行 git fetch pb

$ git fetch [文件夹名]

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

5、推送到远程仓库

当你想分享你的项目时,必须将其推送到上游。 这个命令很简单:git push [remote-name] [branch-name]。 当你想要将 master 分支推送到 origin 服务器时(再次说明,克隆时通常会自动帮你设置好那两个名字),那么运行这个命令就可以将你所做的备份到服务器:

$ git push origin master/

     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,这样就保证了所有人的改动都会被考虑进来.

6、查看远程仓库

如果想要查看某一个远程仓库的更多信息,可以使用 git remote show [remote-name] 命令。 如果想以一个特定的缩写名运行这个命令,例如 origin,会得到像下面类似的信息:

$ git remote show origin

7、远程仓库的移除与重命名

如果想要重命名引用的名字可以运行 git remote rename 去修改一个远程仓库的简写名。 例如,想要将pb 重命名为 paul,可以用 git remote rename 这样做:

$ git remote rename pb paul

如果因为一些原因想要移除一个远程仓库 - 你已经从服务器上搬走了或不再想使用某一个特定的镜像了,又或者某一个贡献者不再贡献了- 可以使用 git remote rm :

$ git remote rm paul




0 0