git基础

来源:互联网 发布:怎样搭建服务器网络 编辑:程序博客网 时间:2024/06/08 15:13

分支管理

git branch:查看分支,带*的是当前分支git branch Common:创建分支Commongit checkout Common:切换到分支Commongit checkout -b Common:创建并切换到分支Commongit merge dev:合并dev分支到当前分支Commongit branch -d dev:删除分支devgit branch -D dev:强制删除分支dev(假如dev尚未合并,用上一条命令会删除失败,可以用这条命令强制删除)git branch -a:查看远程仓库的分支git push origin master:将本地的master分支推送到远程仓库git checkout -b dev origin/dev:将远程仓库的dev分支抓取到本地git branch --set-upstream dev origin/dev:将本地dev分支与远程origin/dev分支的链接git push origin :dev:删除远程分支devgit pull origin master:将远程修改的更新到本地

注:git pull = git fetch + git merge

远程仓库

git remote add origin git@github.com:changjiang007/gitTest.git :  github上的gitTest仓库与本地的gitTest关联$ git clone git@github.com:changjiang007/iscroll.git:将github上的iscroll远程仓库克隆到本地git remote:显示当前的远程仓库(其实现实出来的是别名,如:origin)git remote -v  :显示当前的远程仓库详细信息git remote rename 旧远程仓库名  新远程仓库名

基本操作

git status:查看当前代码库的状态git add file:向git库中添加file文件git add . :向git库中添加当前master中的所有文件git commit -m "备注":提交git add的文件,注意必须要加上备注git push -u origin master:将提交的内容推送到远程仓库(如:github上),注:第一次提交时要加上-u,以后就可以不用加了

注:(1)(2)(3)顺序不能乱

环境配置

git config --global user.name "Your Name":配置用户名git config --global user.email "email@example.com":配置邮箱

注:git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。 这两条配置一个是用户名一个是邮箱地址,每次Git提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录

git config --list:查看已有的所有配置信息git config user.name:查看user.name的配置信息git help:显示所有常见的命令

标签

git tag:查看所有标签git tag v1.0:创建标签v1.0git show v1.0:查看标签v1.0的信息git tag -d v1.0:删除标签v1.0git push origin v1.0 :推送本地标签v1.0到远程仓库git push origin --tags:推送本地所有的标签到远程仓库git push origin :refs/tags/v1.0:删除远程标签v1.0,注意:删除远程标签之前现在本地把这个标签删除

日志信息

git log:查看查看每次提交修改的记录,显示从最近到最远的提交日志 git log -p:查看提交记录并显示每次修改的diffgit log -pretty=oneline:简要列出所有提交记录日志git log --pretty=oneline --abbrev-commit:显示所有历史提交的commit idgit show HEAD:显示当前分支的最新版本的更新细节  注:git show 与 git show HEAD的效果相同

版本回退

git reset HEAD^   :返回到上一版本,即回滚一个版本git reset HEAD^^  回滚两个版本,依此类推git reset --hard "commit id":回退后再返回新版本,commit id为新版本的commit idgit reflog:显示所有的命令历史记录git reset HEAD filename:把暂存区的修改撤销掉git checkout --file:丢弃文件file在工作区的修改隐藏工作现场git stash :把当前工作现场(当前分支的工作)“储藏”起来git stash list:查看隐藏的工作现场git stash apply:恢复工作现场git stash drop:删除stash内容git stash pop:表示恢复的同时把stash内容也删除了,可以代替前两条命令

其他

git rm filename:将文件从版本库中删除,然后再git commit,这样就从版本库中删除成功

ssh-keygen -t rsa -C "youremail@example.com" :创建ssh key

撤消操作

任何时候,你都有可能需要撤消刚才所做的某些操作。接下来,我们会介绍一些基本的撤消操作相关的命令。请注意,有些撤销操作是不可逆的,所以请务必谨慎小心,一旦失误,就有可能丢失部分工作成果。
修改最后一次提交

有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作,可以使用 –amend 选项重新提交:

$ git commit --amend

此命令将使用当前的暂存区域快照提交。如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明,但将要提交的文件快照和之前的一样。

启动文本编辑器后,会看到上次提交时的说明,编辑它确认没问题后保存退出,就会使用新的提交说明覆盖刚才失误的提交。

如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行 –amend 提交:

$ git commit -m 'initial commit'$ git add forgotten_file$ git commit --amend

上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。
取消已经暂存的文件

接下来的两个小节将演示如何取消暂存区域中的文件,以及如何取消工作目录中已修改的文件。不用担心,查看文件状态的时候就提示了该如何撤消,所以不需要死记硬背。来看下面的例子,有两个修改过的文件,我们想要分开提交,但不小心用 git add . 全加到了暂存区域。该如何撤消暂存其中的一个文件呢?其实,git status 的命令输出已经告诉了我们该怎么做:

$ git add .$ git status# On branch master# Changes to be committed:#   (use "git reset HEAD <file>..." to unstage)##       modified:   README.txt#       modified:   benchmarks.rb#

就在 “Changes to be committed” 下面,括号中有提示,可以使用 git reset HEAD … 的方式取消暂存。好吧,我们来试试取消暂存 benchmarks.rb 文件:

$ git reset HEAD benchmarks.rbbenchmarks.rb: locally modified$ git status# On branch master# Changes to be committed:#   (use "git reset HEAD <file>..." to unstage)##       modified:   README.txt## 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:   benchmarks.rb#

这条命令看起来有些古怪,先别管,能用就行。现在 benchmarks.rb 文件又回到了之前已修改未暂存的状态。
取消对文件的修改

如果觉得刚才对 benchmarks.rb 的修改完全没有必要,该如何取消修改,回到之前的状态(也就是修改之前的版本)呢?git status 同样提示了具体的撤消方法,接着上面的例子,现在未暂存区域看起来像这样:

# 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:   benchmarks.rb#

在第二个括号中,我们看到了抛弃文件修改的命令(至少在 Git 1.6.1 以及更高版本中会这样提示,如果你还在用老版本,我们强烈建议你升级,以获取最佳的用户体验),让我们试试看:

$ git checkout -- benchmarks.rb$ git status# On branch master# Changes to be committed:#   (use "git reset HEAD <file>..." to unstage)##       modified:   README.txt#

可以看到,该文件已经恢复到修改前的版本。你可能已经意识到了,这条命令有些危险,所有对文件的修改都没有了,因为我们刚刚把之前版本的文件复制过来重写了此文件。所以在用这条命令前,请务必确定真的不再需要保留刚才的修改。如果只是想回退版本,同时保留刚才的修改以便将来继续工作,可以用下章介绍的 stashing 和分支来处理,应该会更好些。

记住,任何已经提交到 Git 的都可以被恢复。即便在已经删除的分支中的提交,或者用 –amend 重新改写的提交,都可以被恢复(关于数据恢复的内容见第九章)。所以,你可能失去的数据,仅限于没有提交过的,对 Git 来说它们就像从未存在过一样。

远程仓库的使用

要参与任何一个 Git 项目的协作,必须要了解该如何管理远程仓库。远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有些可以写。同他人协作开发某个项目时,需要管理这些远程仓库,以便推送或拉取数据,分享各自的工作进展。管理远程仓库的工作,包括添加远程库,移除废弃的远程库,管理各式远程库分支,定义是否跟踪这些分支,等等。本节我们将详细讨论远程库的管理和使用。
查看当前的远程库

要查看当前配置有哪些远程仓库,可以用 git remote 命令,它会列出每个远程库的简短名字。在克隆完某个项目后,至少可以看到一个名为 origin 的远程库,Git 默认使用这个名字来标识你所克隆的原始仓库:

$ git clone git://github.com/schacon/ticgit.gitInitialized empty Git repository in /private/tmp/ticgit/.git/remote: Counting objects: 595, done.remote: Compressing objects: 100% (269/269), done.remote: Total 595 (delta 255), reused 589 (delta 253)Receiving objects: 100% (595/595), 73.31 KiB | 1 KiB/s, done.Resolving deltas: 100% (255/255), done.$ cd ticgit$ git remoteorigin

也可以加上 -v 选项(译注::此为 –verbose 的简写,取首字母),显示对应的克隆地址:

$ git remote -vorigin  git://github.com/schacon/ticgit.git

如果有多个远程仓库,此命令将全部列出。比如在我的 Grit 项目中,可以看到:

$ cd grit$ git remote -vbakkdoor  git://github.com/bakkdoor/grit.gitcho45     git://github.com/cho45/grit.gitdefunkt   git://github.com/defunkt/grit.gitkoke      git://github.com/koke/grit.gitorigin    git@github.com:mojombo/grit.git

这样一来,我就可以非常轻松地从这些用户的仓库中,拉取他们的提交到本地。请注意,上面列出的地址只有 origin 用的是 SSH URL 链接,所以也只有这个仓库我能推送数据上去(我们会在第四章解释原因)。
添加远程仓库

要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行 git remote add [shortname] [url]:

$ git remoteorigin$ git remote add pb git://github.com/paulboone/ticgit.git$ git remote -vorigin  git://github.com/schacon/ticgit.gitpb  git://github.com/paulboone/ticgit.git

现在可以用字串 pb 指代对应的仓库地址了。比如说,要抓取所有 Paul 有的,但本地仓库没有的信息,可以运行 git fetch pb:

$ git fetch pbremote: Counting objects: 58, done.remote: Compressing objects: 100% (41/41), done.remote: Total 44 (delta 24), reused 1 (delta 0)Unpacking objects: 100% (44/44), done.From git://github.com/paulboone/ticgit * [new branch]      master     -> pb/master * [new branch]      ticgit     -> pb/ticgit

现在,Paul 的主干分支(master)已经完全可以在本地访问了,对应的名字是 pb/master,你可以将它合并到自己的某个分支,或者切换到这个分支,看看有些什么有趣的更新。
从远程仓库抓取数据

正如之前所看到的,可以用下面的命令从远程仓库抓取数据到本地:

$ git fetch [remote-name]

此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。运行完成后,你就可以在本地访问该远程仓库中的所有分支,将其中某个分支合并到本地,或者只是取出某个分支,一探究竟。(我们会在第三章详细讨论关于分支的概念和操作。)

如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。所以,git fetch origin 会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以来别人提交的更新)。有一点很重要,需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。

如果设置了某个分支用于跟踪某个远端仓库的分支(参见下节及第三章的内容),可以使用 git pull 命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。在日常工作中我们经常这么用,既快且好。实际上,默认情况下 git clone 命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)。所以一般我们运行 git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。
推送数据到远程仓库

项目进行到一个阶段,要同别人分享目前的成果,可以将本地仓库中的数据推送到远程仓库。实现这个任务的命令很简单:: git push [remote-name] [branch-name]。如果要把本地的 master 分支推送到 origin 服务器上(再次说明下,克隆操作会自动使用默认的 master 和 origin 名字),可以运行下面的命令:

$ git push origin master

只有在所克隆的服务器上有写权限,或者同一时刻没有其他人在推数据,这条命令才会如期完成任务。如果在你推数据前,已经有其他人推送了若干更新,那你的推送操作就会被驳回。你必须先把他们的更新抓取到本地,合并到自己的项目中,然后才可以再次推送。有关推送数据到远程仓库的详细内容见第三章。
查看远程仓库信息

我们可以通过命令 git remote show [remote-name] 查看某个远程仓库的详细信息,比如要看所克隆的 origin 仓库,可以运行:

$ git remote show origin* remote origin  URL: git://github.com/schacon/ticgit.git  Remote branch merged with 'git pull' while on branch master    master  Tracked remote branches    master    ticgit

除了对应的克隆地址外,它还给出了许多额外的信息。它友善地告诉你如果是在 master 分支,就可以用 git pull 命令抓取数据合并到本地。另外还列出了所有处于跟踪状态中的远端分支。

上面的例子非常简单,而随着使用 Git 的深入,git remote show 给出的信息可能会像这样:

$ git remote show origin* remote origin  URL: git@github.com:defunkt/github.git  Remote branch merged with 'git pull' while on branch issues    issues  Remote branch merged with 'git pull' while on branch master    master  New remote branches (next fetch will store in remotes/origin)    caching  Stale tracking branches (use 'git remote prune')    libwalker    walker2  Tracked remote branches    acl    apiv2    dashboard2    issues    master    postgres  Local branch pushed with 'git push'    master:master

它告诉我们,运行 git push 时缺省推送的分支是什么(译注::最后两行)。它还显示了有哪些远端分支还没有同步到本地(译注::第六行的 caching 分支),哪些已同步到本地的远端分支在远端服务器上已被删除(译注::Stale tracking branches 下面的两个分支),以及运行 git pull 时将自动合并哪些分支(译注::前四行中列出的 issues 和 master 分支)。
远程仓库的删除和重命名

在新版 Git 中可以用 git remote rename 命令修改某个远程仓库在本地的简短名称,比如想把 pb 改成 paul,可以这么运行:

$ git remote rename pb paul$ git remoteoriginpaul

注意,对远程仓库的重命名,也会使对应的分支名称发生变化,原来的 pb/master 分支现在成了 paul/master。

碰到远端仓库服务器迁移,或者原来的克隆镜像不再使用,又或者某个参与者不再贡献代码,那么需要移除对应的远端仓库,可以运行 git remote rm 命令:

$ git remote rm paul$ git remoteorigin
0 0
原创粉丝点击