Git入门基本操作学习总结(更新中)

来源:互联网 发布:阿里云先知白帽大会 编辑:程序博客网 时间:2024/04/29 00:19

本篇为学习小结,参考了很多的博客,包括:
廖雪峰的《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教程》)

工作区和暂存区的关系(图片来源:廖雪峰的《Git教程》)

对于任何一个文件,在 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 statusOn branch developerYour 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.cppno changes added to commit (use "git add" and/or "git commit -a")   

git status命令之后的就是当前工作区和版本库状态不同之处。

如果所有修改都commit过,则会提示工作区“clean”,如下:

$ git statusOn branch developerYour 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.cppindex 1123445 12345--- a/xxx/xxx.cpp+++ b/xxx/xxx.cpp@@ -206,25 +206,25 @@ ...

git diff "xxx.cpp"命令后为具体差异,本文中以xxx代替。

(3)git log命令

该命令会显示从最近到最远的提交记录,每条记录中显示版本号、提交者、提交日期以及提交记录四项。举例:

<code>git log</code>命令举例

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 commitgit 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 推送最新修改。

示例如下图:
GitHello

git push -u origin master 如果当前分支与多个主机存在追踪关系,则可以使用-u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push

不带任何参数的git push,默认只推送当前分支,这叫做simple方式,还有一种matching方式,会推送所有有对应的远程分支的本地分支, Git 2.0之前默认使用matching,现在改为simple方式。如果想更改设置,可以使用git config命令。git config --global push.default matchinggit 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. 解决冲突

(待续…)

原创粉丝点击