本篇为学习小结,参考了很多的博客,包括:
廖雪峰的《Git教程》
Tyrion-Lannister的《Git常用命令详解》
https://git-scm.com/
技术学习小组的《SSH 和 HTTP 的区别》
一. 安装Git
1. Mac上安装
(1)通过homebrew
先安装homebrew,然后使用命令安装。(homebrew使得很多Mac软件安装特别方便。TODO:homebrew学习总结)
$ brew install git
(2)图形化git安装工具
下载链接:http://sourceforge.net/projects/git-osx-installer/
2. Windows上安装
使用msysGit的exe安装,下载链接:https://git-for-windows.github.io/
3. Linux上安装
(参考博客中有,尚未用到,尝试后添加)
4. 安装后检查
使用命令检查安装是否完成
$ git --version
安装完成后,设置name和email,如下:
$ git config --global user.name "自己的名字"
$ git config --global user.email "自己的邮箱"
检查个人信息设置
$ git config --global --list
二. git 概念理解
1. 版本控制系统
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
为了保存版本,许多人习惯复制粘贴然后编号,很麻烦。应运而生本地版本控制系统。
后来,为了让在不同系统上的开发者协同工作,产生了集中式的版本控制系统。
由于中央服务器故障风险过大,产生了分布式的版本控制系统。
2. 版本库
版本库,repository,又名仓库,版本库中所有的改动都可以被追踪,这就是我们要进行版本控制的“暂存箱”。每一次提交都被看作一个版本,有特有的16进制版本号。
3. 工作区和暂存区
(1)工作区
在电脑本地的操作目录,就是工作区。
(2)暂存区
在工作区中有一个隐藏目录.git
,这是git用来跟踪管理版本库的,不要手动修改。在此目录中,最重要的就是称为stage(或者叫index)的暂存区,add
后即提交到暂存区还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
对于任何一个文件,在 Git 内都只有三种状态:已修改(modified),已暂存(staged)和已提交(committed)。已修改表示修改了某个文件,但还没有提交保存(尚未add);已暂存表示把已修改的文件放在下次提交时要保存的清单中(已经add);已提交表示该文件已经被安全地保存在本地数据库中了。
4. 远程仓库
远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有些可以写。同他人协作开发某个项目时,需要管理这些远程仓库,以便推送或拉取数据,分享各自的工作进展。
三. 将远程仓库项目克隆到本地
之所以单开一个题目,是想学习一下SSH和HTTP克隆的区别。
1. SSH和HTTP的区别
HTTP克隆初次操作上比较方便,直接复制,使用克隆命令即可,但是每次对于远程仓库的操作都要输入用户名和密码,比较麻烦;SSH在操作前必须先配置和添加好SSH Key,因此必须是本项目的拥有者,否则无法创建。SSH配好后每次操作无需输入用户名和密码。
2. 使用HTTP克隆
在目标文件夹下使用命令(URL为项目地址,从项目出处复制即可):
$ git clone http://github.com/someone/some_project.git
3. 使用SSH克隆
(1)检查是否已有SSH Key
在terminal(Windows为git bash)中执行以下命令:
$ cd ~/.ssh ls
若已经存在id_rsa.pub和id_dsa.pub文件,则表明已经存在SSH Key,可跳过(2)步骤 。
(2)创建一个SSH Key
在terminal(Windows为git bash)中执行以下命令:
$ ssh-keygen -t rsa -C "youremail"
参数含义:
- -t 指定秘钥类型,默认rsa,可以省略;
- -C 设置注释,比如邮箱;
- -f指定秘钥文件存储文件名,以上代码未设定,所以执行上述代码后会提示设置文件名,建议直接回车使用默认,就会生成id_rsa和id_rsa.pub两个秘钥文件。
接着会提醒输入密码,这是push文件时要用的密码,可以不设置直接回车。接着会提示
Your identification has been saved in /c/Users/you/.ssh/id_rsa.
Your public key has been saved in /c/Users/you/.ssh/id_rsa.pub.
即已经生成成功,使用(1)中方法可以确认是否生成成功,使用以下命令可以查看生成的SSH Key:
$ cat ~/.ssh/is_rsa.pub
(3)使用SSH克隆
首先根据不同平台不同方式,将SSH Key添加到git服务器,然后使用如下命令(URL为项目地址,从项目出处复制即可):
$ git clone git@github.com/someone/some_project.git
四. 版本库相关常用命令
1. 创建版本库
在目标文件夹下执行命令
$ git init
之后会出现.git
文件夹,表示创建成功。
2. 将文件添加到版本库
(1)git add
命令
可以一次暂存一个文件,也可以一次暂存多个文件。举例:
$ git add test.txt
$ git add test1.txt test2.txt
(2)git commit
命令
会将所有add到暂存区的文件一次性提交到本地数据库,可以先add多次,一次commit。举例:
$ git commit -m "注释信息"
3. 查看当前状态和提交历史
(1)git status
命令
查看当前工作区和版本库状态差异。举例:
$ git status
On branch developer
Your branch is up-to-date with 'origin/developer'.
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: tester/xxx/xxx.cpp
modified: tester/xxx/xxx.cpp
no changes added to commit (use "git add" and/or "git commit -a")
在git status
命令之后的就是当前工作区和版本库状态不同之处。
如果所有修改都commit过,则会提示工作区“clean”,如下:
$ git status
On branch developer
Your branch is up-to-date with 'origin/developer'.
nothing to commit, working tree clean
(2)git diff "filename"
命令
查看当前工作区和版本库具体差异,举例:
$ git diff "xxx.cpp"
diff --git a/xxx/xxx.cpp b/xxx/xxx.cpp
index 1123445 12345
--- a/xxx/xxx.cpp
+++ b/xxx/xxx.cpp
@@ -206,25 +206,25 @@
...
git diff "xxx.cpp"
命令后为具体差异,本文中以xxx代替。
(3)git log
命令
该命令会显示从最近到最远的提交记录,每条记录中显示版本号、提交者、提交日期以及提交记录四项。举例:
git log
命令举例(图片来源:
Git入门——本地版本库操作)
如果嫌输出信息太多,可以加上–pretty=oneline参数:
$ git log --pretty=oneline
(4)版本回退
每一次的commit算一个版本,Git必须知道当前版本是哪个版本。在Git中,用HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
可以使用以下命令回退到上一版本:
$ git reset --hard HEAD^
当然也可以在--hard
参数后直接写版本号,方便定位哪一个版本,如下:
$ git reset --hard commit_id
只要本次命令窗口没有关闭,还是可以找到版本号后,通过同样的命令回到未来的版本。假如进程关闭之后再想回到未来版本的话,可以使用git reflog
命令查看命令历史,从中获知未来版本的版本号并进行穿梭。
(5)撤销修改
(a)撤销工作区的修改
命令 git checkout -- xxx.cpp
可以把xxx.cpp文件在工作区的修改全部撤销,这里有两种情况:
- xxx.cpp自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- xxx.cpp已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。checkout
命令其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
(b)撤销暂存区的修改
命令git reset HEAD xxx.cpp
可以把暂存区的修改撤销掉(unstage),重新放回工作区。
(6)删除文件
首先删除工作区的文件,可以右键delete,也可以调用rm xxx.cpp
命令,删除后工作区和暂存区将出现版本不一致。
此时有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm xxx.cpp
删掉,然后git commit
,则成功从版本库中删除。
另一种情况是删错了,可以使用git checkout -- xxx.cpp
把误删的文件恢复到最新版本。
四. 远程仓库相关命令
1. 添加远程库
在GitHub上新建仓库,并将本地库与远程库关联。
要关联一个远程库,使用命令 git remote add origin git@server-name:path/repo-name.git
;
关联后,使用命令 git push -u origin master
第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令 git push origin master
推送最新修改。
示例如下图:
git push -u origin master
如果当前分支与多个主机存在追踪关系,则可以使用-u
参数指定一个默认主机,这样后面就可以不加任何参数使用git push
。
不带任何参数的git push
,默认只推送当前分支,这叫做simple方式,还有一种matching方式,会推送所有有对应的远程分支的本地分支, Git 2.0之前默认使用matching,现在改为simple方式。如果想更改设置,可以使用git config命令。git config --global push.default matching
或 git config --global push.default simple
;可以使用git config -l
查看配置
注:Git 的origin和master分析-From Lishic
注:忽略特殊文件方法:.gitignore
文件
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
- 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
如果你确实想添加该文件,可以用-f强制添加到Git:
$ git add -f App.class
或者你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查:
$ git check-ignore -v App.class
.gitignore:3:*.class App.class
Git会告诉我们,.gitignore的第3行规则忽略了该文件,于是我们就可以知道应该修订哪个规则。
五、分支管理
1. 分支的创建与合并
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
2. 解决冲突
(待续…)
远程删除文件、文件夹
场景:先前上传项目的时候有些需要忽略的文件夹并未加入.gitignore文件中,导致上传了一些并不想上传的文件。(比如不小心将下图的.idea、out、nowcoder.iml上传到了github上)
我们想要在github上面删除,但又不想在本地删除然而,github界面上只能删除文件而不能删除文件夹,所以只能用指令来操作步骤:(以删除.idea文件夹为例)
git rm -r --cached .idea #--cached不会把本地的.idea删除
git commit -m 'delete .idea dir'
git push -u origin master