@llplmlyd
2018-10-11T19:56:27.000000Z
字数 4766
阅读 994
Git
用途:多人在线协作,记录文件中的每次改动的时间和内容。
Git的诞生:BitMover公司的BitKeeper为Linux的免费使用权的收回。使得Linus自己去开发了一个版本控制系统即Git。
集中式:版本库是集中存放在中央服务器的,个人每次使用时,都必须从中央调用出来,然后改完后再放回中央。
缺点即需要联网。网速可能会影响协作效率。
而分布式:人人都有版本库。无需联网。这样对于同一份文件,每个人自己修改完之后,就可以存储在本地当中,随时可以修改,并且如果多人协作查看修改,则相互之间互推修改版本就可看到对方修改的内容。分布式也可以有一台充当“ 中央服务器 ”的电脑。这样方便“交换”大家的修改。修改的内容会覆盖上去。可以每个人负责不同的版块,然后拼接成一个完整的文件。然后还有所谓主次之分,即所有的修改需要经过主负责审核,才能通过与覆盖。
并且分布式相较于集中式安全,就是由于人人有版本库,就不担心其中一台电脑出事后,所有数据都丢失了。
1.输入Git查看系统是否安装git:$ git
2.根据返回的信息协作,安装。
(Debian或Ubuntu Linux)键入下值即可安装。
sudo apt-get install git
如果是其他Linux版本,可以直接通过源码安装。先从Git官网下载源码,然后解压,依次输入: ./config,make,sudo make install 这几个命令安装就好了。
两种安装方法:
1.安装homebrew(软件包管理器),通过它安装Git,具体方法请参考homebrew的文档:http://brew.sh/
2.AppStore安装Xcode。运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”。
Windows下要使用很多Linux/Unix的工具时,需要Cygwin这样的模拟环境,Git也一样。有高人已经把模拟环境和Git都打包好了,名叫msysgit,只需要下载一个单独的exe安装程序,从https://git-for-windows.github.io下载(国内镜像网站https://pan.baidu.com/s/1kU5OCOB#list/path=%2Fpub%2Fgit)
可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
$ mkdir learngit # 创建目录
$ cd learngit # 进入目录learngit
$ pwd #显示目录路径
/Users/michael/learngit
$ git init #将目录初始化为git
Initialized empty Git repository in /Users/michael/learngit/.git/
$ ls # 可以查看当前列表是否已经建立版本库
learngit
$ ls -ah #查看隐藏目录
. .bash_history .gitconfig
.. .git learngit
$ git add readme.txt #learngit目录下新建readme.txt,然后将新建的文件夹加入到缓存区stage(或index)
$ git commit -m "wrote a readme file" #将文件提交到master区间
[master (root-commit) cb926e7] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
$ git log #查看修改的详细过程
commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 15:11:49 2013 +0800
wrote a readme file
如果觉得git log命令太多可以使用下面的这个命令,这两个可以查看自己修改过的版本,然后利用commit id进行版本回退或者前进
$ git log --pretty=oneline #省略不必要的信息
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
版本回退
在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
$ git reset --hard HEAD^ #回到上一个版本
HEAD is now at ea34578 add distributed
$ cat readme.txt #使用cat可以查看是否回退到上一个版本
再次利用git log可以查看历史版本,就会发现刚刚的版本不见了,如果又想回去回到“未来”的状态,那么:
$ git reflog #这个命令记录了每一次命令的过程ID,查到后再用reset就可回到未来。
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file
而采用git status 可以查看状态(该图与上图无关联)
$ git status #查看版本修改的确定态
# On branch master
nothing to commit (working directory clean)
为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。下面的例子可以说明对修改过程的控制:
对版本库中主分支的 readme.txt 进行.第一次修改后 git add -->添加到了暂存区,如果这个时候再对 readme.txt 进行二次修改 但却没有git add 到缓存区,那么进行 git commit-->提交到master中 是第一次修改后的内容,第二次的修改是无效的。
[x]第一次修改 -> git add -> 第二次修改 -> git add -> git commit
[]第一次修改 -> git add -> 第二次修改 -> git commit
$ git diff HEAD -- readme.txt
使用这个命令可以查看工作区和版本库里最新版本的区别,以分辨提交的是第几次修改的内容
$ cat readme.txt #使用cat命令可以查看txt文本的内容
1.如果在工作区的文件输入错误但未添加到暂缓区域,可使用 git checkout -- file 丢弃修改。
[x]如果缓存区中原有该文件,则回退到缓存区的文件状态。
[x]如果没有,则是回退到版本库master中的文件状态。
$ git checkout -- readme.txt
2.若错误内容已添加git add到了暂缓区域,但未 commit。可使用reset 命令回到到工作区。 git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
3.不仅 git add -->缓存区,而且还 git commit-->到版本库了...
还好还好,还没推到远程仓库。使用上面说过的 版本回退 就可以回到初始状态啦,不虚不虚
4.删除文件:git rm file
,删错可使用于 git checkout --
一键还原
(先在Github中配置所需要的步骤SSH keygen)
1.关联远程仓库。
远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。例如:
$ git remote add origin git@github.com:Github账户名/learngit.git
git remote add origin git@server-name:path/repo-name.git
2.把本地库的所有内容推送到远程库上
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
$ git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
$ git push origin master
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
解决冲突:
[]本地分支冲突, 解决完冲突再提交即可。
[]远程仓库,多人协作冲突。推送到远程库中出现冲突那么要使用下拉,先冲远程拉下文件,在本地解决完冲突再提交即可。但在下拉前要注意 如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
再使用 git pull ,后续与本地分支冲突处理方法类似。
tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。
1.给分支打标签:在分支所在目录下 运行 git tag 即可
$ git tag #再用这个即可查看所有标签名
2.给 commit Id 打标签:如果commit id是6224937,则
$ git tag v0.9 6224937
先用git tag 查看了所有标签后, 用 git show 可查看对应标签的详细信息。
$ git show v0.9
commit 622493706ab447b6bb37e4e2a2f276a20fed2ab4
Author: Michael Liao <askxuefeng@gmail.com>
Date: Thu Aug 22 11:22:08 2013 +0800
add merge
3.标签打错了,也可以删除
命令git push origin <tagname>可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签;
命令git tag -d <tagname>可以删除一个本地标签;
命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
$ git tag -d 标签
利用$ git config --global alias.
别名 原命令名 ” 就可以给复杂的命令配置别名
$ git config --global alias.st status
后面的就不写啦啦啦,详细的教程都在廖雪峰的网站上面有。
https://www.liaoxuefeng.com/