git入门

初步配置

  Git是一个高可配置软件。首先,我们可以用config命令配置一下用户名和用户邮箱

git config --global user.name "liu"
git config --global user.email "liu@163.com"

创建版本库

  进入项目所在目录,右键点击Git Bash Here 然后初始化

git init

img

  会生成一个名为 .git的隐藏目录

img

三种状态

  已提交(committed)、已修改(modified)和已暂存(staged)

提交文件到版本库

  在Git 中,我们通常将项目的一个版本称之为一次提交,但这要分两个步骤来实现。第一步,我们要先用add命令来确定哪些文件应被包含在下次提交中。第二步,再用commit 命令将修改传送到版本库中,并赋予该提交一个散列值以便标识这次新提交。(注:这里与linux命令几乎一样,一样可以用tab键补全)

$ git add foo.txt bar.txt
$ git commit --message "Sample project imported."
注:--message "Sample project imported." 是对本次提交的状态描述。
如果不加,会调转到一个页面,在那个页面上写也是一样。
但是必须要写,不然会终止这次提交

img

检查状态

  首先修改一下foo.txt 文件的内容,先删除bar.txt 文件,再添加一个名为bar.html的新文件。然后,status 命令就会显示出该项目自上次提交以来所发生的所有修改。注意,新文件bar.html 在这里被标示成了未跟踪状态,这是因为我们还没有用add 命令将其注册到版本库。

$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    bar.txt
        modified:   foo.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        bar.html

no changes added to commit (use "git add" and/or "git commit -a")

img

  也可以通过diff 命令来显示其每个被修改的行

$ git diff foo.txt
warning: LF will be replaced by CRLF in foo.txt.
The file will have its original line endings in your working directory.
diff --git a/foo.txt b/foo.txt
index e69de29..86c8bbd 100644
--- a/foo.txt
+++ b/foo.txt
@@ -0,0 +1 @@
+liu

img

提交修改

  接下来,所有的修改都必须要先被归档成一次新的提交。我们要对修改过的文件和新文件执行add 命令,并对要删除的文件使用rm 命令。

$ git add foo.txt bar.html
$ git rm bar.txt  // 该命令执行两个操作,1.删除文件 2.将被删除的文件纳入到暂存区
rm 'bar.txt'

  现在再次调用status 命令,我们会看到所有的修改已经被纳入了下一次提交中。

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        renamed:    bar.txt -> bar.html
        modified:   foo.txt

  然后用commit 命令提交这些修改。

$ git commit --message "Some changes."
[master 38ff1c5] Some changes.
 2 files changed, 1 insertion(+)
 rename bar.txt => bar.html (100%)

显示历史

  log 命令可用来显示项目的历史,所有提交都会按时间顺序被降序排列出来。

$ git log

img

.gitignore

// 将某些不需要纳入到git版本控制系统的文件忽略掉,免得老是提示
// 首先创建一个文件
touch .gitignore
// 然后将需要忽略的文件名写入到.gitignore文件中就可以了
vi .gitignore
// 然后将.gitignore这个文件提交到git上面就可以了

// 注:.gitignore也支持正则表达式,通配符这类的模糊匹配

img

克隆版本库

  克隆的版本库副本(也称为克隆体)中包含了所有的原始信息与整个项目的历史信息。

$ git clone ../test ../test-clone
Cloning into '../test-clone'...
done.

img

从另一版本库中获取修改

  我们来修改一下test/foo.txt 文件,并执行以下操作来创建一次新提交。

$ cd test
$ git add foo.txt
$ git commit --message "A change in the original."

img

  现在,新的提交已经被存入了我们原来的test 版本库中,但其克隆版本库(test-clone)中依然缺失这次提交。在接下来的步骤中,再来修改克隆版本库中的test-clone/bar.html 文件,并执行以下操作。

$ cd ../test-clone/
$ vi bar.html
$ git add bar.html
$ git commit --message "A change in the clone."
$ git log --oneline
878f94e (HEAD -> master) A change in the clone.
38ff1c5 (origin/master, origin/HEAD) Some changes.
bb25202 Sampe project imported.

img

  现在,两个版本库中各做了一次新的提交。接下来,我们要用pull 命令将原版本库中的新提交传递给它的克隆体。由于之前我们在创建克隆版本库时,原版本库的路径就已经被存储在了它的克隆体中,因此pull 命令知道该从哪里去取回新的提交。(注:直接输入git pull会打开一个新的命令窗口,就更上面的过程一样,你可以在里面添加描述,也可以直接退出)。pull 命令从原版本库中取回了新的修改,将它们与克隆体中的本地修改进行了对比,并在工作区中合并了两边的修改,创建了一次新的提交。这个过程就是所谓的合并(merge)。

$ git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From D:/Git相关资料/test/../test
   38ff1c5..680ba23  master     -> origin/master
Merge made by the 'recursive' strategy.
 foo.txt | 1 +
 1 file changed, 1 insertion(+)

  在拉回(pull)、合并(merge)的过程完成之后,我们可以用一个新的log 命令来查看结果。这次是日志的图形化版本。

$ git log --graph
*   commit 5b1a0e01a6f2ca5a322a42abc2077d5f7aba8588 (HEAD -> master)
|\  Merge: 878f94e 680ba23
| | Author: liuxu <34370520@qq.com>
| | Date:   Sat Apr 27 10:36:04 2019 +0800
| |
| |     Merge branch 'master' of D:/Git相关资料/test/../test
| |
| * commit 680ba2371fed93718c1fadbb94dc32bb7ee968fd (origin/master, origin/HEAD)
| | Author: liuxu <34370520@qq.com>
| | Date:   Sat Apr 27 10:30:05 2019 +0800
| |
| |     A change in the original.
| |
* | commit 878f94eaf64b71f6672fda82db3f771fba38253d
|/  Author: liuxu <34370520@qq.com>
|   Date:   Sat Apr 27 10:35:12 2019 +0800
|
|       A change in the clone.
|
* commit 38ff1c595614fad5cb2ce840b2173f094d089d1d
| Author: liuxu <34370520@qq.com>
| Date:   Sat Apr 27 10:23:31 2019 +0800
|
|     Some changes.
|
* commit bb25202ba2b9052a889d58dbf848d2c5496958fe
  Author: liuxu <34370520@qq.com>
  Date:   Sat Apr 27 10:13:36 2019 +0800

      Sampe project imported.

  这一次,历史记录不再是一条直线了。在上面的日志中,我们可以很清晰地看到并行开发的过程(即中间的两次提交),以及之后用于合并分支的那次合并提交(即顶部的那次提交)(注:顺序是从下往上)

从任意版本库中取回修改

  在没有参数的情况下,pull 命令只在克隆版本库中能发挥作用,因为只有该克隆体中有默认的原版本库的连接。当我们执行pull 操作时,也可以用参数来指定任意版本库的路径,以便从某一特定开发分支中提取相关修改。现在,将克隆体中的修改pull 到原版本库中去。

$ cd ../test
$ git pull ../test-clone/ master
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (5/5), done.
From ../test-clone
 * branch            master     -> FETCH_HEAD
Updating 680ba23..5b1a0e0
Fast-forward
 bar.html | 1 +
 1 file changed, 1 insertion(+)

创建共享版本库

  除了可以用pull 命令从其他版本库中取回相关提交外,我们也可以用push 命令将提交传送给其他版本库。只不过,push 命令只适用于那些没有开发者在上面开展具体工作的版本库。最好的方法就是创建一个不带工作区的版本库,我们称之为裸版本库(bare repository)。你可以使用clone 命令的–bare 选项来创建一个裸版本库。裸版本库通常可被用来充当开发者们传递提交(使用push 命令)的汇聚点,以便其他人可以从中拉回他们所做的修改。

$ git clone --bare ../test ../test-share.git
Cloning into bare repository '../test-share.git'...
done.

img

用push 命令上载修改

  再次修改一下test/foo.txt 文件,并执行以下操作来创建一次新的提交。

$ cd test
$ vi foo.txt
$ git add foo.txt
$ git commit --message "More changes in the original."
$ git push ../test-share.git/ master
Counting objects: 3, done.
Delta compression using up to 12 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 289 bytes | 289.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../test-share.git/
   5b1a0e0..afe9420  master -> master

img

img

Pull 命令:取回修改

  现在,为了让克隆版本库也得到相应的修改,我们需要在执行pull 命令时配置参数指向共享版本库的路径参数。

$ cd ../test-clone/
$ git pull ../test-share.git/ master
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From ../test-share
 * branch            master     -> FETCH_HEAD
Updating 5b1a0e0..afe9420
Fast-forward
 foo.txt | 1 +
 1 file changed, 1 insertion(+)

img

  注意!如果另一个开发者在此之前已经做过一次push 操作,此次push 命令就会被拒绝传送提交。这时候,必须要先做一次pull 操作,将其他人新上载的更新取回,并在本地合并。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值