关于Git的学习笔记

git

写在前面的话

  1. 为什么要使用版本控制软件?
    答: 能够更好地控制增删改等操作,同时方便与别人协作编辑。
  2. 分布式(git)还是集中式(svn)?
    答:分布式版本控制有更多的优点如:
    • 不需要联网
    • 每台电脑都有自己版本,不需要先从主服务器上下载
    • 强大的分支管理能力

windows上安装git

  从这里下载git并依据提示操作安装即可。
  安装完之后,需要进行最后一步的设置

1
2
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

  在这里输入用户名与邮箱即可。

创建一个新项目

本地创建

  OK, 首先我们在本地创建一个名为test的文件夹。进入文件夹,打开git bash,输入’git init’。然后可以看到多了一个.git文件夹,里面存放了git相关的文件。.git
  接着我们在目录下创建一个文件README.md,里面随便写点什么(注意在windows下不要使用notepad进行编辑,否则会出现各种奇怪的问题。使用其他编辑器编辑时,要注意编码模式为UTF-8 without BOM)
  打开git bash,输入

1
git status

  这时可以看到提示git bash的提示为

1
2
3
4
5
6
7
8
9
10
On branch master

Initial commit

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

README.md

nothing added to commit but untracked files present (use "git add" to track)

  git有工作区,缓存区和提交的概念。这里的提示为新建了一个README.md的文件,但是还没有放到缓存区和提交。

1
2
3
git add README.md
git commit -m "wrote a README file"
git status

  这时候显示已经正式提交(没有需要提交的内容)

1
2
On branch master
nothing to commit, working directory clean

部署到远程服务器

  首先是在github上创建一个新的repo,名字为test。
  回到本地目录,输入

1
2
git remote add origin git@github.com:你的用户名/你的项目名字
# 这里origin是git默认的远程库的叫法,也可以改成其他的。

  将本地库的所有内容推送到远程库上

1
2
3
git push -u origin master
# 第一次推送加上-u参数将本地master和远程master关联起来,后续不需要加上-u参数
# 这一步ssh key的作用至关重要,需要注意自己的ssh key是否已经配置好。这里建议在自己的账号下添加ssh key,而不是在一个repo下添加deploy key(在一个repo下添加的deploy key不能同时在另一个repo下添加)

  打开github上所创建的那个repo,可以发现其目录结构与我们本地库的一样。至此,我们已经成功地建立一个项目并推送到远程服务器上(github)。

项目的修改管理、分支与标签

项目的修改管理

  1. 将项目退回到过去的某个commit上 

1
2
3
git log --pretty=oneline # 查询提交的历史,并决定退回到哪一个阶段

git reset --hard HEAD~<number> # 退回到前<number>次的提交中

  那么,当退回之后后悔了呢?想回到未来了呢?

1
2
3
git reflog # 查询所有commit的编号(包括未来的)

git reset --hard <commit id>

  通过git reset --hard <commit id>,我们可以穿梭于各个时间段的提交中(感觉很神奇,有木有)~
  2. 项目修改的撤销 

1
2
3
4
5
git checkout -- <file> # 撤销工作区的修改

git reset HEAD <file> # 将暂存区的修改撤销(这时只剩下工作区的修改)

git reset --hard <commit id> # 退回到过去的某次提交中

项目的分支

  1. 添加分支并转到分支

1
2
3
git branch <new branch>

git checkout <new branch>

  或者可以直接使用

1
git checkout -b <new branch>

  2. 合并某分支到当前分支
  比如,我们合并一个branch到master分支里面

1
2
3
git checkout master

git merge <branch>

  3. 删除分支

1
git checkout -d <branch>

项目的标签

  1. 创建标签

1
git tag <name> <commit id> # 后面的<commit id>可以不填

  2. 操作标签

1
2
3
4
5
6
7
git tag -d <tag name> # 删除标签

git push origin <tag name> # 远程推送某个标签

git push origin --tags # 远程推送本地的所有标签

git push origin :/refs/tags/<tag name> # 删除远程的某个标签

常用git命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
git clone ssh://username@domain.com/repo.git # 克隆远程仓库到本地

git init # 初始化本地仓库

git status # 初始化本地仓库

git diff # 对比文件的修改部分

git add <file> # 将修改的文件添加到缓存区

git commit # 将缓存区的文件提交

git log # 查看修改记录

git log -p <file> # 查看具体文件的修改记录

git blame <file> # 查看谁在什么时候修改了具体文件

git log --pretty=oneline # 每条操作记录以单行展示

git branch -av #详细展示分支的信息

git checkout <branch> #转到另一个分支中

git branch <new-branch> #创建一个新的分支

git branch -d <branch> #删除一个分支

git tag <tag-name> #给当前提交打上标签

git remote -v # 列出配置的远程库

git pull <roemote> <branch> # 下载远程库的改动

git push <remote> <branch> # 将本地库推送到远程库

git push --tags # 将标签推送到远程库

git merge <branch> # 合并当前分支到master上

git reset --hard <commit> # 将工作区回到到某个提交上

git checkout HEAD <file> # 丢弃某个文件的修改

git push origin :<branch> #删除远程分支

  更多的git命令请参考git help

参考网站

  1. 廖雪峰的git教程
  2. 个人学习git的资料整理
  3. git官方文档