1、Git 的下载和安装
1.1、 git官网下载安装程序:点击进入Git官网下载
1.2、按默认选项直接下一步至安装完成即可
1.3、安装完成后,在开始菜单里找到Git->Git Bash
,弹出一个类似命令行窗口的东西,就说明Git安装成功
或者点击鼠标右键菜单中出现如下选项点击Git Bash出现下图说明安装成功。
2、配置Git的使用者信息
# 显示当前的Git配置
$ git config --list
# 设置提交代码时的用户信息
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"
=======================操作演示==========================
(1)在开始菜单里找到
图片.png (2)按回车键,什么也不显示,如下图即表示配置成功Git->Git Bash
点击弹出命令窗口后输入
图片.png (3)再如上一样的流程 配置$ git config [--global] user.email "[email address]"
(4)配置方法二: 依次找到文件:C盘>用户>系统用户>.gitconfig
用编辑器打开.gitconfig 文件找到里边的name 和emali 修改掉即可。
3、创建git仓库
# 在当前目录新建一个Git代码库
$ git init
# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]
# 克隆远程仓库项目和它的整个代码历史
$ git clone [url]
=======================操作演示==========================
$ git init 使用演示
(1)打开项目工作文件夹目录右键鼠标点击
图片.png (2)在命令窗口输入Git Bash
选项调出命令窗口
git init
按回车键初始化git仓库
此时项目工作文件夹目录生成 .git文件
表示创建成功
图片.png 图片.png$ git clone [url] 使用说明
先创建远程仓库,然后从远程库克隆仓库。(新项目开发时)注意:[url] 指的是远程仓库地址
在想要放置的文件夹下右键鼠标点击Git Bash
打开命令窗口输入如下命令,回车后将生成MyGluttonousSnake文件夹
$ git clone https://github.com/M-jh/MyGluttonousSnake.git
4、远程仓库github
已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步
4.1、注册并登入github账号
自行进入官网注册好
4.2、本地Git仓库和GitHub仓库之间的传输通过SSH加密免登入设置
第1步:创建SSH Key
(1)在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。
(2)如果没有,Windows下打开Git Bash,输入$ ssh-keygen
创建SSH Key
$ ssh-keygen
然后一路回车,使用默认值即可
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。第2步:登陆GitHub进行配置
图片.png 图片.png
(1)登入后进入设置
(2)然后,在Key文本框里粘贴id_rsa.pub文件的内容,输入密码验证即可
图片.png
4.3、创建远程仓库
登入在右上角找到“new repository”按钮,创建一个新的仓库
图片.png 图片.png 图片.png
4.4、将远程仓库与本地仓库关联
图片.png
git push -u origin master
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
git push origin master
4.5、从远程仓库克隆仓库到本地
先创建远程仓库,然后从远程库克隆仓库。(新项目开发时)
在想要放置的文件夹下右键鼠标点击Git Bash打开命令窗口输入如下命令
$ git clone https://github.com/M-jh/MyGluttonousSnake.git
回车后将生成MyGluttonousSnake文件夹
4.6、SSH警告
当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established. RSA key fingerprint is xx.xx.xx.xx.xx. Are you sure you want to continue connecting (yes/no)?
这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
这个警告只会出现一次,后面的操作就不会有任何警告了。
5、增加/删除文件
提交文件到暂存区
# 添加指定文件到暂存区 ( [file1] 表示文件名含后缀名 可同时指定多个)
$ git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
$ git add [dir]
# 添加当前目录的所有文件到暂存区
$ git add .
# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p
删除文件
# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...
# 删除暂存区该文件,但该文件会保留在工作区
$ git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]
========================操作说明==========================
使用 git rm [file1]
图片.png 1、如果确实要从版本库中删除该文件,那就用命令
当你直接在文件管理器中把没用的文件删了,或者用rm命令删了
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status
命令会立刻告诉你哪些文件被删除了git rm
删掉,并且git commit
图片.png
使用 git checkout -- git rm [file1]
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- tools.js
6、代码提交到git仓库
# 提交暂存区到仓库区
$ git commit -m [message]
# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]
# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a
# 提交时显示所有diff信息
$ git commit -v
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...
为什么Git添加文件需要add
,commit
一共两步呢?因为commit
可以一次提交很多文件,所以你可以多次add
不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
使用$ git add 表示告诉git仓库我要提交哪些文件并放入暂存区,
使用$ git commit 将这些文件提交到git仓库清空暂存区
7、git工作区和暂存区
工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西
------(1) 其中最重要的就是称为stage(或者叫index)的暂存区
------(2) 还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步
用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步
用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master
分支,所以,现在,git commit
就是往master
分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
图片.png8、分支
查看分支&创建分支
# 列出所有本地分支
$ git branch
# 列出所有远程分支
$ git branch -r
# 列出所有本地分支和远程分支
$ git branch -a
# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
# 新建一个分支,并切换到该分支
$ git checkout -b [branch]
# 以远程分支为基础新建一个分支,并切换到该分支
$ git checkout -b [branch] origin/[remote-branch]
# 新建一个分支,指向指定commit
$ git branch [branch] [commit]
# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]
【注意】执行git branch
返回中是绿色字体并标有号的表示是当前的分支名)返回中是绿色字体并标有号的表示是当前的分支名
切换分支
# 切换到指定分支,并更新工作区
$ git checkout [branch-name]
# 切换到上一个分支
$ git checkout -
【注意】切换分支前,要把当前分支中暂存区文件先提交或清空,或用git stash
临时存储当前暂存区文件,不然该分支中暂存区文件会跑到新分支中去,到重新切换回是用git stash pop
取出即可 。
合并分支
# 合并指定分支到当前分支
$ git merge [branch]
# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]
【注意】合并前必须将当前分支转到要合并到的分支上用git log --graph
命令可以看到分支合并图
删除分支
# 删除分支
$ git branch -d [branch-name]
#强制删除分支
git branch -D [branch-name]
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
========================操作说明==========================
使用 $ git branch -d [branch-name]
【注意】要删除该分支则该分支中的内容必须被合并到它的主分支上,并在主分支中操作使用 $ git branch -D [branch-name]
【注意】当未合并是要删除,即为强制删除,必须在主分支中操作分支管理 branch
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。所以,团队合作的分支看起来就像这样:
图片.png
推送分支到远程仓库
推送分支,就是把该分支上的所有本地提交推送到远程库。
推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
#向远程仓库推送分支
$ git push [origin] [branch]
#向远程仓库推送master分支
$ git push origin master
#如果要推送其他分支,比如dev,就改成:
$ git push origin dev
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
9、储藏和取出当前分支中的暂存区文件
#储藏当前分支中的暂存区文件
$ git stash
#取出当前分支中被储藏的暂存区文件
$ git stash pop
10、标签
查看标签
# 列出所有tag
$ git tag
# 查看tag信息
$ git show [tag]
新建标签
# 新建一个tag在当前commit
$ git tag [tag]
# 新建一个tag在指定commit
$ git tag [tag] [commit]
#创建带有说明的tag在指定commit
#用-a指定标签名,-m指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" 1094adb
删除标签
# 删除本地tag
$ git tag -d [tag]
# 删除远程tag
$ git push origin :refs/tags/[tagName]
向远程仓库提交标签
# 提交指定tag
$ git push [remote] [tag]
# 提交所有tag
$ git push [remote] --tags
新建一个分支,指向某个tag
# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]
========================操作说明==========================
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
• 命令
git push origin <tagname>
可以推送一个本地标签;
• 命令git push origin --tags
可以推送全部未推送过的本地标签;
• 命令git tag -d <tagname>
可以删除一个本地标签;
• 命令git push origin :refs/tags/<tagname>
可以删除一个远程标签。
在Git中打标签
首先,切换到需要打标签的分支上
然后,敲命令git tag <name>
就可以打一个新标签:
$ git tag v1.0
可以用命令git tag查看所有标签:
$ git tag
v1.0
默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?
方法是找到历史提交的commit id,然后打上就可以了
$ git log --pretty=oneline
比方说要对某次提交打标签,从上面的查询历史中找到对应的commit id假如是f56c683,敲入命令:
$ git tag v0.9 f56c683
再用命令git tag查看标签:
$ git tag
v0.9
v1.0
注意,标签不是按时间顺序列出,而是按字母排序的。可以用
git show <tagname>
查看标签信息:
$ git show v0.9
commit f52c63349bc3c1593499807e5c8e972b82c8f286 (tag: v0.9)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:56:54 2018 +0800
创建带有说明的标签
用
-a
指定标签名,-m
指定说明文字:
$ git tag -a v0.1 -m "version 0.1 released" 1094adb
用命令
git show <tagname>
可以看到说明文字:
$ git show v0.1
删除标签
$ git tag -d v0.1
Deleted tag 'v0.1' (was f15b0dd)
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
推送某个标签到远程 使用命令
git push origin <tagname>
$ git push origin v1.0
Total 0 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
* [new tag] v1.0 -> v1.0
推送全部尚未推送到远程的本地标签
$ git push origin --tags
Total 0 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
* [new tag] v0.9 -> v0.9
删除远程标签
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除
$ git tag -d v0.9
Deleted tag 'v0.9' (was f52c633)
然后,从远程删除。删除命令也是push,但是格式如下:
$ git push origin :refs/tags/v0.9
To github.com:michaelliao/learngit.git
- [deleted] v0.9
要看看是否真的从远程库删除了标签,可以登陆GitHub查看。
11、查看信息
显示有变更的文件信息
# 显示有变更的文件
$ git status
git status
命令可以让我们时刻掌握仓库当前的状态(1)显示当前在哪个git仓库分支上
(2)有没有提交过文件
(3)未提交过的文件有哪些
(4)提交过,再被修改后未重新提交的文件git diff <file>
可查看修改后于之前的不同之处
(5)使用git add <file>
提交到暂存区的文件 但是未git commit -m <message>
的文件有哪些
查看历史
# 显示当前分支的版本历史
$ git log
# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat
# 搜索提交历史,根据关键词
$ git log -S [keyword]
# 显示某个commit之后的所有变动,每个commit占据一行
$ git log [tag] HEAD --pretty=format:%s
# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
$ git log [tag] HEAD --grep feature
# 显示某个文件的版本历史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]
# 显示指定文件相关的每一次diff
$ git log -p [file]
# 显示过去5次提交
$ git log -5 --pretty --oneline
图片.png
git log
命令显示从最近到最远的提交日志
显示远程仓库文件修改的用户信息
# 显示所有提交过的用户,按提交次数排序
$ git shortlog -sn
# 显示指定文件是什么人在什么时间修改过
$ git blame [file]
显示文件差异
# 显示暂存区和工作区的差异
$ git diff
# 显示暂存区和上一个commit的差异
$ git diff --cached [file]
# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD
# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]
# 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"
# 显示某次提交的元数据和内容变化
$ git show [commit]
# 显示某次提交发生变化的文件
$ git show --name-only [commit]
# 显示某次提交时,某个文件的内容
$ git show [commit]:[filename]
# 显示当前分支的所有命令记录
$ git reflog
【注意】回退到之前的某个版本后再执行git log回退到的之前某个版本后的之后提交记录就没有了如果再想找回哪些版本只能通过git reflog查看所有命令历史来找回了
12、远程同步
# 下载远程仓库的所有变动
$ git fetch [remote]
# 显示所有远程仓库
$ git remote -v
# 显示某个远程仓库的信息
$ git remote show [remote]
# 增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]
# 取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch]
# 上传本地指定分支到远程仓库
$ git push [remote] [branch]
# 强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force
# 推送所有分支到远程仓库
$ git push [remote] --all
13、撤销
# 恢复暂存区的指定文件到工作区
$ git checkout [file]
# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]
# 恢复暂存区的所有文件到工作区
$ git checkout .
# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]
# 重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard
# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]
# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]
# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]
# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]
# 暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop
版本回退
git reset --hard commit_id命令
根据
git log
得到提交记录,根据提交记录找到自己想要回退的版本然后记录下这个版本提交时生成的commit_id
,然后运行
git reset --hard commit_id` 命令即可回退到那个版本撤销文件在工作区的全部修改
git checkout -- readme.txt
命令意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:一种是
readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是
readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- file
。场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
14、生成可供发布的压缩包
# 生成一个可供发布的压缩包
$ git archive
15、获取github上优秀开源项目
如何参与一个开源项目呢?
比如人气极高的bootstrap项目,这是一个非常强大的CSS框架,你可以访问它的项目主页https://github.com/twbs/bootstrap
点“Fork”就在自己的账号下克隆了一个bootstrap仓库,然后,从自己的账号下clone到本地:
git clone [url]
一定要从自己的账号下clone仓库,这样你才能推送修改。如果从bootstrap的作者的仓库地址git@github.com:twbs/bootstrap.git
克隆,因为没有权限,你将不能推送修改。
如果你想修复bootstrap的一个bug,或者新增一个功能,立刻就可以开始干活,干完后,往自己的仓库推送。
如果你希望bootstrap的官方库能接受你的修改,你就可以在GitHub上发起一个pull request。当然,对方是否接受你的pull request就不一定了。
十六、忽略特殊文件
有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不爽。
好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
最后一步就是把.gitignore
也提交到Git,就完成了
十七、配置简写名称
有没有经常敲错命令?比如git status?status这个单词真心不好记。
如果敲git st就表示git status那就简单多了,当然这种偷懒的办法我们是极力赞成的。
我们只需要敲一行命令,告诉Git,以后st就表示status:
$ git config --global alias.st status
好了,现在敲git st看看效果。
当然还有别的命令可以简写,很多人都用co表示checkout,ci表示commit,br表示branch:
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中
==================================================
点击查看 Git分支管理-版本回退-撤销文件修改
网友评论