-------
GIT安装
-------
1.linux安装git
sudo apt-get install git 老一点: sudo apt-get install git-core
2.maxOS安装git
brew install git
3.windows安装git
msysgit是Windows版的Git,从http://msysgit.github.io/下载,然后按默认选项安装即可。安装完成后,在开始
菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
---------
创建版本库
---------
1.创建版本库--版本库增加文件 ".git" 文件
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
把上面目录变成版本库
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
2.
初始化一个Git仓库,使用git init命令。
添加文件到Git仓库,分两步:
第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;
第二步,使用命令git commit,完成。
------------------
3.查看当前版本库状态--git status
如果只修改了没有git add
git status尾行显示--no changes added to commit (use "git add" and/or "git commit -a")
如果只git add了 没有git commit
git status第二行显示--Changes to be committed
如果第一次提交的文件没有被git add会显示
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: readme.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
LICENSE
**************上面代码表示readme.txt文件被修改了,LICENSE从来没被添加过******************
-------
版本回退
-------
1.git log命令显示从最近到最远的提交日志,重要参数 --pretty=oneline
2.git回退版本(回到过去)
在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
$ git reset --hard HEAD^
$ git reset --hard 3628164
回到过去的版本
3.git回到未来版本(回到未来)
git reflog 记录了你每一次git命令
可以用这个回到未来的版本
4.现在总结一下:
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
------------
工作区和暂存区
------------
1.工作区--自己本地分支的东西
2.暂存区--git add之后我们认为把代码提交到了暂存区
----------
git管理修改
----------
1.放弃工作区的修改
git checkout -- readme.txt
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: readme.txt
git reset HEAD readme.txt 可以把暂存区的修改撤销掉(unstage),工作区重新变成git add之前的状态
2.git管理小结
git checkout -- readme.txt 放弃工作区的修改
git reset HEAD readme.txt 放弃缓存区的修改回到git add之前的状态
-------
删除文件
-------
1.$ rm test.txt
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
deleted: test.txt
rm 直接删除是删除工作区中的文件
a.如果你的目的是把版本库中的也删除,需要git add 然后git commit操作
b.如果你觉得删错了还可以用 git checkout -- test.txt,把该文件从版本库中找回来
2.小结
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢
复文件到最新版本,你会丢失最近一次提交后你修改的内容。
----------
建立远程仓库
----------
1.建立远程仓库
a.创建SSH Key。
在用户主目录下,看看有没有.ssh目录,如果有,再看这个目录下有没有id_rsa和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash).
创建SSH Key:ssh-keygen -t rsa -C "[email protected]"
b.登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
另一个办法是自己动手,搭一个Git服务器,因为是你自己的Git服务器,所以别人也是看不见的。
c.从github建立远程分支 把git地址记住
touch README.md //新建一个记录提交操作的文档
git init //初始化本地仓库
git add README.md //添加
git commit -m "first commit"//提交到要地仓库,并写一些注释
git remote add origin [email protected]:youname/Test.git //连接远程仓库并建了一个名叫:origin
git push -u origin master //将本地仓库的东西提交到地址是origin的地址,master分支下
2.github问题
/**LINUX命令复习**/
//删除当前文件夹下的所有 name含有.svn 文件
find . -name ".svn" | xargs rm -Rf
//删除当前文件夹下的所有 name含有.git 文件
find . -name ".git" | xargs rm -Rf
/**LINUX命令复习**/
如果输入$ git remote add origin [email protected]:djqiang(github帐号名)/gitdemo(项目名).git
提示出错信息:fatal: remote origin already exists.
解决办法如下:
a、先输入$ git remote rm origin
b、再输入$ git remote add origin [email protected]:djqiang/gitdemo.git 就不会报错了!
c、如果输入$ git remote rm origin 还是报错的话,
error: Could not remove config section ‘remote.origin‘. 我们需要修改gitconfig文件的内容
d、找到你的github的安装路径,
我的是C:\Users\ASUS\AppData\Local\GitHub\PortableGit_ca477551eeb4a6720bb5c8\etc
e、找到一个名为gitconfig的文件,打开它把里面的[remote "origin"]那一行删掉就好了!
如果输入$ ssh -T [email protected]
出现错误提示:Permission denied (publickey).因为新生成的key不能加入ssh就会导致连接不上github。
解决办法如下:
a、先输入$ ssh-agent,再输入$ ssh-add ~/.ssh/id_key,这样就可以了。
b、如果还是不行的话,输入ssh-add ~/.ssh/id_key 命令后
出现报错Could not open a connection to your authentication agent.解决方法是key用Git Gui
的ssh工具生成,这样生成的时候key就直接保存在ssh中了,不需要再ssh-add命令加入了,其它的user,token
等配置都用命令行来做。
c、最好检查一下在你复制id_rsa.pub文件的内容时有没有产生多余的空格或空行,有些编辑器会帮你添加这些的。
如果输入$ git push origin master
提示出错信息:error:failed to push som refs to .......
解决办法如下:
a、先输入$ git pull origin master //先把远程服务器github上面的文件拉下来
b、再输入$ git push origin master
c、如果出现报错 fatal: Couldn‘t find remote ref master 或者
fatal: ‘origin‘ does not appear to be a git repository 以及
fatal: Could not read from remote repository.
d、则需要重新输入$ git remote add [email protected]:djqiang/gitdemo.git
-----------
添加远程仓库
-----------
要关联一个远程库,使用命令git remote add origin [email protected]:path/repo-name.git;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
------------
从远程仓库克隆
------------
$ git clone [email protected]:michaelliao/gitskills.git
Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。
使用https除了速度慢以外,每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议
而只能用https。
------------
创建与合并分支
------------
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
-------
解决冲突
-------
$ git log --graph --pretty=oneline --abbrev-commit 分支合并图
----------
分支管理策略?
----------
主分支 master 最干净的一个分支不在此分支上做任何操作
开发分支 dev 开发人员主要工作的分支,用来做周期开发,快速迭代开发
修改bug fixbug 修改bug的一个分支
???????????????????非常重要的一章--开始???????????????????
---------
fixbug分支
---------
应用场景
你需要修改一个master(线上)分支的一个很紧急的bug,这个bug需要在1小时内解决,dev分支的功能开发到一半还
需要很长时间(远远大于1小时),这个时候你需要怎么做呢?
你可以这样来做:
git checkout -b fixbug
然后修改bug(现在是在最新从master检出的fixbug分支上修改bug)---修改完成
git add ./
git commit -m ‘修改***的bug‘
git checkout dev
$ git stash
# Saved working directory and index state WIP on dev: 6224937 add merge
# HEAD is now at 6224937 add merge
git status
# From developer.playcrab.com:zhaoqiang/luck_draw
# * branch dev -> FETCH_HEAD
# Already up-to-date.
git merge fixbug --no-ff -m ‘修改***的bug后,合并fixbug分支的内容到dev‘
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了
你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
$ git stash apply [email protected]{0}
git stash pop (这时候你再用git stash list来查看暂存的东西)
git checkout master
git merge fixbug --no-ff -m ‘修改***的bug后,合并fixbug分支的内容到dev‘
然后删除fixbug分支 git branch -d fixbug (-d销毁fixbug分支 -D强制销毁)
这样做是为了以后dev分支开发完之后和master分支合并的时候不冲突
???????????????????非常重要的一章--结束???????????????????
-------
多人协作
-------
1.当你使用git clone 从远程分支克隆的时候,本地master分支和远程的master分支会自动对应起来,且远程仓库的默认
名称默认为origin
查看远程库的分支git remote 或者详细信息 git remote -v
origin [email protected]:michaelliao/learngit.git (fetch)
origin [email protected]:michaelliao/learngit.git (push)
把本地分支推送到远程分支
git push origin 分支名称(本地分支名称一般和远程分支名称是一致的)
# Please specify which branch you want to merge with.
# See git-pull(1) for details
# git pull <remote> <branch>
# If you wish to set tracking information for this branch you can do so with:
# git branch --set-upstream dev origin/<branch>
上面是git pull 失败 需要的步骤
设置dev和origin/dev的链接:
$ git branch --set-upstream dev origin/dev
2.多人协作步骤
因此,多人协作的工作模式通常是这样:
q.首先,可以试图用git push origin branch-name推送自己的修改;
b.如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
c.如果合并有冲突,则解决冲突,并在本地提交;
d.没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
e.如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,
用命令git branch --set-upstream branch-name origin/branch-name。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
-------
标签管理
-------
1.git打标签
切换到需要打标签的分支
git tag v1.0 或者
git tag -a <tagname> -m "blablabla..." 指定标签备注的标签
查看所有标签
git tag
查看标签信息
git show v1.0
2.git标签操作
删除标签
$ git tag -d v1.0
推送本地标签到远程
git push origin <tagname>
例如 git push origin v1.0
一次推送本地所有未能推送到远程的标签
$ git push origin --tags
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
$ git tag -d v0.9
# Deleted tag ‘v0.9‘ (was 6224937)
$ git push origin :refs/tags/v0.9
# To [email protected]:michaelliao/learngit.git
# - [deleted] v0.9
--------
自定义git
--------
1.让Git显示颜色,会让命令输出看起来更醒目:
$ git config --global color.ui true
2.配置快捷键
$ git config --global alias.st status (git status = git st)
$ git config --global alias.co checkout(git checkout = git co)
$ git config --global alias.ci commit (git commit = git ci)
$ git config --global alias.br branch (git branch = git br)
怎么删除git配置文件的快捷键
只需要到用户主目录找到.gitconfig 文件 把对应的行删除就行了 cd ~/
或者
git config --global --unset alias.st
查看配置别名
git config --list | grep alias
git config --get-regexp alias
------------
搭建git服务器
------------
前提
搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可
以完成安装。
第一步 安装git服务
$ sudo apt-get install git
第二步,创建一个git用户,用来运行git服务:
$ sudo adduser git
第三步,创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到:
/home/git/.ssh/authorized_keys文件里,一行一个。
第四步,初始化Git仓库:
先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
$ sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服
务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
$ sudo chown -R git:git sample.git
第五步,禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash 改为
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就
自动退出。
第六步,现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:
$ git clone [email protected]:/srv/sample.git
这里我们不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。