Git引言
什么是Git?
-Git是目前世界上最先进的分布式版本控制系统(没有之一)(*@ο@*) 哇~。
什么是GitHub?
-提供Git仓库托管服务,只要注册一个GitHub账号就可以免费获取Git远程仓库,创建仓库时属性若选为public则代码相当于开源代码,其他账号均可fork到自己仓库查看代码,也可选收费private仓库不开源代码,看自己的选择而定。
谁创建的?
-Linux之父Linus Torvalds。
用来干什么的?
-简而言之是一个用来帮助开发人员进行开发工作的工具,可以完成协同开发、代码备份、冲突解决、权限管理、版本还原等功能。
今天内容是git本地仓库中常用命令以及远程仓库为gitHub托管所的使用,小整理出来一些git常用命令希望可以帮助大家,后期还会为大家推送开发中Eclipse上使用Egit。
一、首先做准备工作:从网上下载git安装包并安装及创建一个测试仓库文件夹TestGit。
安装完成后在任意的文件目录下鼠标右键会出现以下信息则为安装成功。
显示上图后还需要进行最后一步设置即全局配置所有git分支均可用,点击Git Bash Here ,命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。配置信息在C:Usersadmin路径下的.gitconfig文件里面可以看到。创建一个测试文件夹TestGit作为Git本地仓库,在该文件目录下右键点击Git Bash Here ,命令行输入 git init,该文件夹下面会创建一个隐藏文件.git,则表示创建本地仓库repository 完成。我们便可以在该文件夹下面存放各种文件,git会帮我们将树形目录文件修改或删除历史版本管理起来。
二、准备工作完成之后开始我们的命令使用
git 基本命令:
初始几条命令需要借助git版本库结构理解。
git版本库的组成结构:
-由.git文件夹与工作区两部分组成。.git文件夹中由git版本可与本地库两部分组成,使用add命令将工作区中修改文件添加到stage暂存区(又叫index索引区),commit命令将暂存区所有文件提交到本地库
git init : 初始化仓库
$ git init
Initialized empty Git repository in F:/5.linus/day03 git/TestGit/.git/
git add : 改动文件由工作区add到暂存区
$ git add filename
git commit : 将文件由暂存区commit到本地库
$ git commit -m "message"
[master (root-commit) 053100d] message
1 file changed, 1 insertion( )
create mode 100644 Git_Commands.txt
git status : 查看工作区的文件是否修改、添加、提交状态
解析:
Changes not staged for commit:该文件在工作区中被修改,与暂存区版本不同;
Untracked files:在暂存区并没有找到该文件的任何踪迹;
no changes added to commit (use "git add" and/or "git commit -a"):暂存区与本地库中内容相同
$ git status
On branch master
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: Git_Commands.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
1.txt
no changes added to commit (use "git add" and/or "git commit -a")
git diff : 若文件修改,查看修改内容
解析:
-1<A1><A2>git init - <B3><F5>ʼ<BB><AF><B2>ֿ<E2>
No newline at end of file
1<A1><A2>git init - <B3><F5>ʼ<BB><AF><B2>ֿ<E2> 证明两个文件均有1,而2 、3第二个文件有第一个文件无。
$ git diff Git_Commands.txt
diff --git a/Git_Commands.txt b/Git_Commands.txt
index c98ff22..5d88cb5 100644
--- a/Git_Commands.txt
b/Git_Commands.txt
@@ -1 1,3 @@
-1<A1><A2>git init - <B3><F5>ʼ<BB><AF><B2>ֿ<E2>
No newline at end of file
1<A1><A2>git init - <B3><F5>ʼ<BB><AF><B2>ֿ<E2>
2<A1><A2>git add filename
3<A1><A2>git commit -m "message"
No newline at end of file
git log : 查看历史记录
$ git log
$ git log --pretty=oneline
版本穿梭时光功能即git的主要功能命令。
git reset : 回退功能(可理解穿梭到古代)
由上面的git版本库的组成结构图可知:HEAD作为一个指针指向本地库的文件最新版本,HEAD^表示回退到当前版本的上一个版本,两个^^表示上上一个版本,但是我们想回退到上50个版本呢?所以当回退版本较多时推荐直接回退到相应版本号命令。版本号的选取为前6~7位,避免出现选位少时,当多个版本号前几位相同git不知道回退到哪个版本号。
$ git reset --hard HEAD^
$ git reset --hard 053100
当出现回退行为的时候,git log 将只能显示当前版本之前的历史记录,那么怎么才能重返现代呢?使用git reflog命令查看所有的版本号再使用$ git reset --hard 版本号 即可实现。
git reflog命令查看所有的版本号,从古至今,版本号变化记录
git reset HEAD filename : 将暂存区修改还原即用于当不小心将文件add并未commit时可使用此命令将暂存区新add文件删除。
$ git reset HEAD 1.txt
当工作区文件修改混乱想要找回上一个完整版本的时候使用git checkout --filename命令,则暂存区版本将工作区版本覆盖。
git checkout -- filename : 放弃工作区版本修改将工作区文件回退到暂存区最新版本
此命令也可用于误删了工作区的文件,恰好这个文件又曾经add到暂存区,运行命令令即可将暂存区版本恢复到工作区,但是会丢失文件最新一次修改的内容。
git rm : 删除工作区文件
$ git rm 1.txt
$ git checkout -- 1.txt
注意:
git checkout feature :为切换到另一个分支命令
git 分支命令:
多人协作开发项目,每开发一个新功能均要创建一个新分支进行开发后合并到主分支上,主分支并不进行开发仅用来tag标记发布版本号和合并分支。类似图下:
git branch : 查看当前分支
git branch name : 创建一个新分支
git branch -d name:删除分支
git branch -D name : 强制删除一个未合并过的分支
git checkout feature :为切换到另一个分支命令
git checkout -b name:创建加直接切换
xiaohui@▒▒▒▒▒▒ MINGW32 /f/linus/git/TestGit (master)
$ git checkout -b feature01
Switched to a new branch 'feature01'
xiaohui@▒▒▒▒▒▒ MINGW32 /f/linus/git/TestGit (feature01)
$
git log --graph : 查看分支合并图
git merge feature01: 该分支合并feature01分支内容,若无法合并则需要手动解决冲突。
在主分支中将Git_Commands.txt文件修改,切换到feature01分支上将Git_Commands.txt文件修改后切到主分支上合并feature01分支,必然发生冲突,如下所示,且冲突文件上会有黄色警示号。
xiaohui@▒▒▒▒▒▒ MINGW32 /f/linus/git/TestGit (feature01)
$ git checkout master
Switched to branch 'master'
xiaohui@▒▒▒▒▒▒ MINGW32 /f/linus/git/TestGit (master)
$ git merge feature01
Auto-merging Git_Commands.txt
CONFLICT (content): Merge conflict in Git_Commands.txt
Automatic merge failed; fix conflicts and then commit the result.
xiaohui@▒▒▒▒▒▒ MINGW32 /f/linus/git/TestGit (master|MERGING)
$
解决方法:
使用git diff 查看两个文件的不同,并手动解决后再合并。
<<<<<<< HEAD
=======
>>>>>>> feature01 表示中间的为冲突内容。
$ git diff
diff --cc Git_Commands.txt
index e73c914,dc48471..0000000
--- a/Git_Commands.txt
b/Git_Commands.txt
@@@ -3,5 -3,5 3,10 @@@
3<A1><A2>git commit
4<A1><A2>git log
5<A1><A2>git reflog
<<<<<<< HEAD
6<A1><A2>git diff
- 7<A1><A2>git merge
7<A1><A2>git merge
=======
6<A1><A2>git branch
-7<A1><A2>git branch name
7<A1><A2>git branch name
>>>>>>> feature01
$ git merge feature01
Already up-to-date.
当我们手头正在feature01分支上做着工作,又临时要修复一个bug。当然每个bug都可以通过一个新的临时分支来修复,修复后合并分支,然后将分支删除。
但是若目前工作还达不到提交的状态,转换分支的时候是不可以的。
$ git checkout feature01
error: Your local changes to the following files would be overwritten by checkout:
Git_Commands.txt
Please commit your changes or stash them before you can switch branches.
Aborting
那么我们就可以使用以下命令解决这个问题:
git stash :将当前工作现场封锁起来
然后创建新的bug分支,修改bug,修改完后回到我们工作的分支。工作区是并没有任何修改的迹象的,那我们的工作现场到哪里去了呢?使用git stash list 查看我们的工作现场。
$ git stash list
stash@{0}: WIP on feature01: 6dd29b4 添加分支命令到分支feature01上
git stash apply :恢复封锁工作现场
git stash drop:删除封锁现场痕迹
git stash pop: 快速那么一点点回复现场(= git stash apply git stash drop)
以下为远程仓库与本地仓库交互的操作命令:
git remote add origin git@server-name:path/repo-name.git : 关联远程库命令
$ git remote add origin git@github.com:yourselfgit/TestGit.git
git push -u : 第一次将本地库内容push推送到远程仓库,origin为git远程库的默认叫法
git push : 以后当commit之后就将本地库内容push推送到远程仓库,origin为git远程库的默认叫法
$ git push -u origin master
$ git push origin master
由于我们的本地仓库与GitHub仓库之间是进项SSH加密的所有需要设置两点:
1、创建SSHkey:一路回车使用默认值即可,之后可以在根据命令行提示在用户主目录中找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,是SSH key的秘钥对,id_rsa是私钥一定不要告诉别人,id_rsa.pub是公钥,就是要告诉别人的。
$ ssh-keygen -t rsa -C "yourselfemail@example.com"
2、登录GitHub,登录自己账户->"settings"->"SSH and GPG keys”页面 ,“add SSH key ”->" New SSH key "将id_rsa.pub 粘贴到上面 "Add SSH key ",添加完成后将出现SSH key界面。但是为什么我们需要SSH key呢?是因为GitHub需要通过SSH key 来确定被推送的文件是否为SSH key对应的仓库所推送,而且还可以添加多个SSH key,即可以接收多个仓库进行推送。若为public 仓库则里面的文件被全网共享,但是仅仅可以接收SSH key对应的仓库的推送,这个要搞清楚。
创建仓库,默认选择即可,可以看到下图,Git支持两种协议:(1)http (2)SSH来实现本地仓库到远程仓库的push,但是通过SSH支持的原生Git协议速度快,现在我们来实现本地仓库与远程仓库的文件同步工作吧。
根据仓库提示给本地仓库添加远程仓库并将文件同步:
在本地仓库中右键bash 出命令行
git remote add origin " input SSH key or Http in here " : 添加远程仓库起别名为origin ""中输入从远程仓库复制来的SSH key 或 http网址。
当第一次使用push或clone命令时将会出现警告信息:
$ git push -u origin master
The authenticity of host 'github.com (192.30.253.112)' can't be established.
RSA key fingerprint is SHA256:XXXXX.
Are you sure you want to continue connecting (yes/no)?
这是因为Git使用SSH连接时会让我们确认下GitHub的Key信息是否来自GitHub服务器,输入yes后回车即可。
而后Git会输出警告告知我们已经将该GitHub的相关信息添加到信任列表,之后再进行推送就不会再出现了。
克隆:
从远程库克隆文件到我们GitHub仓库,在GitHub账户中创建一个新的仓库TestClone,复制其SSH key 或https ,我们在本地库使用命令
进行远程仓库到本地仓库的clone,这样的话远程仓库里面的文件就下载到本地啦。
$ git clone git@github.com:zhangzh121/TestClone.git
抓取分支:
当多人协作时,大家会在各个分支上推送各自的修改,当远程仓库同一个文件被不同的人修改并前后推送时,第二个小伙伴必然会推送失败,那么怎么解决冲突呢?
$ git push origin master
To git@github.com:zhangzh121/MyFirstRepo.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'git@github.com:zhangzh121/MyFirstRepo.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
首先,使用git pull 命令将文件拉到本地,手动解决冲突代码,后add->commit->push后就能成功了,若pull时显示“no tracking information”,则是因为没此分支问题则使用分支命令git branch --set-upstream breach-name origin/branch-name。
tag标签:
git tag name : 为主分支版本打上新标签即版本号
git tag : 查看所有的标签
$ git tag v1.0 //为当前版本打上v1.0标签
$ git tag v1.0 053100 //为指定版本打上v1.0标签
$ git push origin v1.0 //远程推送特定版本
$ git push origin --tags //将全部未推送远程仓库的本地标签推送
$ git tag -d v1.0 //删除标签
$ git push origin :refs/tags/v1.0 //将远程仓库推送标签删除
$ git show v1.0 //查看标签信息
ignore文件:
GitHub 已经为我们准备了各种配置文件,可参考在线浏览配置文件:https://github.com/github/gitignore,
此文件的设置主要为:
1、忽略系统自动生成的文件,如缩略图等;
2、忽略编译生成的中间文件、可执行文件等;
3、忽略自己的带有敏感信息的配置文件,如存放口令的配置文件等。
配置别名:
目的简化命令,如下例:
$ git config --global alias.st status
$ git config --global alias.ci commit
$ git config --global alias.st st //则之后使用git st 显示工作区文件修改状态
小整理结束啦!