git介绍

git介绍

使用Git的第一件事就是设置你的名字和email,这些就是你在提交commit时的签名。
$ git config --global user.name "Scott Chacon"
$ git config --global user.email "[email protected]"
执行了上面的命令后,会在你的主目录(home directory)建立一个叫 ~/.gitconfig 的文件
[user]
name = junechiu
email = [email protected]


git status 查看索引

一.  获得git仓库
我们需要一个Git仓库。有两种方法可以得到它:一种是从已有的Git仓库中 clone (克隆,复制);还有一种是新建一个仓库,把未进行版本控制的文件进行版本控制。

1. Clone一个仓库

   为了得一个项目的拷贝(copy),我们需要知道这个项目仓库的地址(Git URL). Git能在许多协议下使用,所以Git URL可能以ssh://, http(s)://, git://,或是只是以一个用户名(git 会认为这是一个ssh 地址)为前辍. 有些仓库可以通过不只一种协议来访问,例如,Git本身的源代码你既可以用 git:// 协议来访问:

   git clone git://git.kernel.org/pub/scm/git/git.git  ******************clone一个仓库******************
   也可以通过http 协议来访问:
   git clone http://www.kernel.org/pub/scm/git/git.git

2. 初始化一个新的仓库

    现在假设有一个叫”project.tar.gz”的压缩文件里包含了你的一些文件,你可以用下面的命令让它置于Git的版本控制管理之下.
    $ tar xzf project.tar.gz
    $ cd project
    $ git init       ******************初始化一个仓库******************
    Git会输出:
    Initialized empty Git repository in .git/
    如果你仔细观查会发现project目录下会有一个名叫”.git” 的目录被创建,这意味着一个仓库被初始化了。



二.  正常的工作流程  add ---> commit --->
    修改文件,将它们更新的内容添加到索引中.
   
    $ git add file1 file2 file3     ******************添加新文件******************
    你现在为commit做好了准备,你可以使用 git diff 命令再加上 --cached 参数 ,看看哪些文件将被提交(commit)。
   
    $ git diff --cached              ******************哪些文件将被提交******************
    也可以用git status命令来获得当前项目的一个状况:
   
    git commit  (git commit -m test) -m后加入提交说明  ******************提交修改******************
       提交命令 这会提示你输入本次修改的注释,完成后就会记录一个新的项目版本.  
       commit注释最好以一行短句子作为开头,来简要描述一下这次commit所作的修改(最好不要超过50个字符);然后空一行再把详细的注释写清楚。这样就可以很方便的用工具把commit注释变成email通知,第一行作为标题,剩下的部分就作email的正文.
  
    除了用git add 命令,还可以用
    $ git commit -a           ******************提交所有修改的文件******************

    这会自动把所有内容被修改的文件(不包括新创建的文件)都添加到索引中,并且同时把它们提交。

    Git跟踪的是内容不是文件 git add 不但是用来添加不在版本控制中的新文件,也用于添加已在版本控制中但是刚修改过的文件


三.  分支与合并@基础
   一个Git仓库可以维护很多开发分支。现在我们来创建一个新的叫”experimental”的分支:
   $ git branch experimental  ******************新建分支*****************
 
   如果你运行下面这条命令:
   $ git branch              ******************查看所有分支******************

   你会得到当前仓库中存在的所有分支列表:
   experimental
   * master
 
  “experimental” 分支是你刚才创建的,“master”分支是Git系统默认创建的主分支。星号(“*”)标识了你当工作在哪个分支下,输入:
  $ git checkout experimental  ******************切换分支******************

  切换到”experimental”分支,先编辑里面的一个文件,再提交(commit)改动,最后切换回 “master”分支。
  (edit file)
  $ git commit -a             ******************提交并 切换******************
  $ git checkout master

  你现在可以看一下你原来在“experimental”分支下所作的修改还在不在;因为你现在切换回了“master”分支,所以原来那些修改就不存在了。

  你现在可以在“master”分支下再作一些不同的修改:
  (edit file)
  $ git commit -a
 
  这时,两个分支就有了各自不同的修改(diverged);我们可以通过下面的命令来合并“experimental”和“master”两个分支:
  $ git merge experimental      ******************合并分支******************

  如果这个两个分支间的修改没有冲突(conflict), 那么合并就完成了。如有有冲突,输入下面的命令就可以查看当前有哪些文件产生了冲突:
 
  $ git diff                     ******************查看冲突的文件******************
  当你编辑了有冲突的文件,解决了冲突后就可以提交了:

  $ git commit -a
 
  提交(commit)了合并的内容后就可查看一下:
  $ gitk                         ******************查看合并的信息******************

  执行了gitk后会有一个很漂亮的图形的显示项目的历史。
  这时你就可以删除掉你的 “experimental” 分支了(如果愿意):
  $ git branch -d experimental   ******************删除一个分支******************

   git branch -d只能删除那些已经被当前分支的合并的分支. 如果你要强制删除某个分支的话就用git branch –D;下面假设你要强制删除一个叫”crazy-idea”的分支:
   $ git branch -D crazy-idea     ******************强制删除某个分支******************
   分支是很轻量级且容易的,这样就很容易来尝试它。


   合并两个分离的分支
   $ git merge branchname         ******************合并分支到当前分支******************
   这个命令把分支"branchname"合并到了当前分支里面。如有冲突(冲突--同一个文件在远程分支和本地分支里按不同的方式被修改了);那么命令的执行输出就像下面一样
   $ git merge next
       100% (4/4) done
       Auto-merged file.txt
       CONFLICT (content): Merge conflict in file.txt
       Automatic merge failed; fix conflicts and then commit the result.
   在有问题的文件上会有冲突标记,在你手动解决完冲突后就可以把此文件添 加到索引(index)中去,用git commit命令来提交,就像平时修改了一个文件 一样。
   如果你用gitk来查看commit的结果,你会看到它有两个父分支:一个指向当前 的分支,另外一个指向刚才合并进来的分支。

   git status 会显示这些文件没有合并(unmerged)

   git reset --hard HEAD     ******************撒销一个合并******************

   $ git reset --hard ORIG_HEAD  ******************合并后代码提交了?******************


   git log  ******************显示所有的提交******************

   git diff master..test       ******************显示两个分支间的差异******************


四. 分布式的工作流程

    Bob执行    git clone /home/alice/project myrepo -->修改 --->git commit -a
    Alice执行  $ cd /home/alice/project
    Alice执行  $ git pull /home/bob/myrepo master ******************拉取项目******************
    git pull命令执行两个操作: 它从远程分支(remote branch)抓取修改 的内容,然后把它合并进当前的分支。

    如果你要经常操作远程分支(remote branch),你可以定义它们的缩写:
    Bob执行   $ git remote add bob /home/bob/myrepo   bob是缩写    在这里远程分支的名 字就叫bob/master.
    Alice执行 $ git fetch bob           这条命令并不会把抓下来的修改合并到当前分支里
    
    Alice执行 $ git log -p master..bob/master  把Bob从Alice的主分支(master)中签出后所做的修改全部显示出来。

    Alice执行 $ git merge bob/master   把bob/master分支合并进来
           也可以用  git pull . remotes/bob/master

    Bob执行 $ git pull
      如果Bob从Alice的仓库克隆(clone),那么他就不需要指定Alice仓库的地 址;因为Git把Alice仓库的地址存储到Bob的仓库配库文件,这个地址就是 在git pull时使用:

      $ git config --get remote.origin.url
        /home/alice/project

    git config -l        ******************git clone创建的所有配置参数******************

    如果Bob打算在另外一台主机上工作,他可以通过ssh协议来执行"clone" 和"pull"操作:
    $ git clone alice.org:/home/alice/project myrepo

   
    将修改推到一个公共仓库
    git push ssh://yourserver.com/~you/proj.git master:master
    

    你可以强制git-push在上传修改时先更新,只要在分支名前面加一个加号。
    $ git push ssh://yourserver.com/~you/proj.git +master




































你可能感兴趣的:(git)