不会命令可使用 TortoiseGit 或者 SourceTreegit
git init --bare shared.git (或者 git init)
git config user.name "wangli"
git config user.email "user@qq.com"
git config --global user.name "wangli"
git config --global user.email "user@qq.com"
cat index.jsp
echo "this is test file" > index.jsp
git clone /f/software/repository/git/shared.git/ .
git clone git@github.com:wangli0/appdemo.git .或者 (git clone git@github.com:wangli0/appdemo.git)
mkdir learngit
pwd
//显示当前路径git status
未提交
$ git diff readme.txt (diff --> difference)
【使用时机,修改readme.txt,但尚未准备提交(还未add commit),想看看这次修改和上次提交的区别】
提交后
用git diff HEAD -- readme.txt
命令能够查看工做区和版本库里面最新版本的区别github
git status
掌握工做区的状态git log
(显示从最近到最远的提交日志)
~~~ 若是嫌输出信息太多,看得眼花缭乱的,能够试试加上--pretty=oneline~~~ (git log --pretty=oneline)
web
版本回退
git reset --hard HEAD^
或者 指定回退的commit对象的id
($ git reset --hard 3628164)
版本号不必写全,git会自动找Git中,用HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^,再往上就是 HEAD~100数据库
git log
穿梭前,能够查看提交历史,以便肯定要回退到哪一个版本git reflog
git checkout -- readme.txt
把readme.txt
文件在工做区的修改所有撤销
--很重要,没有的话就变成了“切换到另外一个分支”的命令
两种状况
一种是readme.txt自修改后尚未被放到暂存区,
如今,撤销修改就回到和版本库如出一辙的状态;
(还不如再次git pull一次或者 直接vim readme.txt)【改变的是工做区内容】
一种是readme.txt已经添加到暂存区后,又在工做区做了修改xx ,如今,撤销修改就回到 刚刚git add到暂存区时的状态暂存区还在bootstrap
git reset HEAD readme.txt
把暂存区的修改撤销掉(unstage)[暂存区不复存在],从新放回工做区vim
删除文件(注,git中删除也是修改操做)
rm index.jsp git rm index.jsp git status git commit -m "remove index.jsp"
安全
github 的使用
因为你的本地Git仓库和GitHub仓库之间的传输是经过SSH加密的
需建立 SSH key
$ ssh-keygen -t rsa -C "youremail@example.com"
服务器
touch readme.md
建立一个空文件网络
重点
不管是
(1)从远程克隆
(2)或者是本地项目提交到github 都须要先在github上面建立一个仓库app
(用的多,此种方式连README.md都不能建立【空仓库】,一旦建立,本地和远程版本就不一致了,须要先pull才能够)
方法1省略
方法2
echo # Appdemo >> README.md git initgit add README.md git commit -m "first commit" git remote add origin git@github.com:wangli0/Appdemo.gitgit push -u origin master
注意:用git push命令,其实是把当前分支master推送到远程。因为远程库是空的,咱们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来
移除关联 git remote rm origin(若是关联已经添加,再次添加会报错)
git checkout -b dev
建立dev分支,-b参数表示 建立并切换
git checkout -b dev
等价于<===>
git branch dev (建立分支 dev) git checkout dev (切换到dev分支) git branch 列出当前的分支
git merge dev // 把dev分支合并到当前分支(默认是Fast-forward快进模式 也就是直接把master 指向dev的当前提交,因此合并速度很是快。) git branch -d dev //如今能够删除 dev分支了
git add a.jsp git commit a.jsp -m "the content is a"
git add a.jsp git commit a.jsp -m "the content is aaaa"
$ git merge dev // 冲突产生,两分支同时修改了一行 , git status查看 冲突的文件
vim a.jsp git add a.jsp git commit -m "conflict fixed" (commit不加文件名哦)
git log --graph --pretty=oneline --abbrev-commit
查看 分支的合并状况
删除分支 git branch -d dev
git merge dev(快进模式) git merge --no-ff -m "merge with no-ff" dev
git log --graph --pretty=oneline --abbrev-commit
--no-ff
*** bug分支***
1.正在 dev分支上工做,此时需修复bug
git stash (保存当前的工做区如 修改index.jsp文件或 git add index.jsp文件 可是尚未提交 commit)
- 切换到修复bug的分支 如 master
git checkout master- 建立bug分支
git checkout -b issue-101 (在此上面修复bug)- 修复完成后,切换到master分支,合并分支issue-101,并删除issue-101分支
git checkout master
git merge --no-ff -m "merged bug fix 101" issue-101
git branch -d issue-101- 是时候接着回到dev分支干活了
git checkout dev (git status 发现 working directory clean工做区是空的 )- git stash list 查看工做现场存哪里了
- 恢复工做区
方式1
git stash apply
(恢复后,stash内容并不删除)
方式2
git stash pop
(恢复的同时把stash内容也删了)- 你能够屡次stash,恢复的时候,先用git stash list
查看,而后恢复指定的stash,用命令:
$ git stash apply stash@{0}
标签
git tag v1.0
(标签就是快照,在当前最新commit上打了一个快照)
或者针对 某个commit id 打标签
git tag v1.0 622222
(622222是commit id)
git tag
git show v1.0 (git show <tagname>)
git tag -a v1.0 -m "version1.0的标签" 6222222
git tag -d v1.0
删除标签 (由于建立的标签都只存储在本地,不会自动推送到远程。因此,打错的标签能够在本地安全删除。)git push origin v1.0
(git push origin
git push origin --tags
//推送本地全部为推送的 标签到远程
git tag -d v1.0 git push origin :refs/tags/v1.0 //注意格式
git config --global color.ui true
//Git显示颜色,会让命令输出看起来更醒目
feature分支(和bug分支,普通分支彻底同样,主要用于开发新功能)
1.git checkout -b feature-1 新建分支,并编写完成新功能
- git checkout dev (切换开发分支)
- git branch -d feature-1
一切顺利的话,feature分支和bug分支是相似的,合并,而后删除- 可是不顺利事情是常有的(忽然因经费问题被叫停 )
分支尚未被合并,若是删除,将丢失掉修改,若是要强行删除,须要使用命令git branch -D feature-1(合并后 的分支删除方法是git branch -d feature-1 小写)
丢弃一个没有被合并过的分支,能够经过git branch -D
强行删除
推送分支
git push origin master
// 指定本地分支 master->远程master
git push origin dev
//指定本地分支 dev ->远程 dev
远程库clone时候 //默认只能clone到远程分支的master分支
我须要在dev分支上开发,就必须建立远程origin的dev分支到本地
git checkout -b dev origin/dev
两人同时push 产生冲突
一样的一个文件 index.jsp ,两人都作了修改
人1: 先git push index.jsp -m "update a file"
人2: git push index.jsp -->出现冲突
缘由: 由于你的小伙伴的最新提交和你试图推送的提交有冲突
解决方案:
人2 : git pull
把最新的提交从origin/dev抓下来,而后,在本地合并,解决冲突,再推送
注意: pull的时候 须要指定 本地 dev分支与 远程 origin/dev分支的连接git branch --set-upstream dev origin/dev
git remote -v 查看 远程库信息
从本地推送分支,使用git push origin branch-name
,若是推送失败,先用git pull
抓取远程的新提交
研究发现,如APPdemo文件夹下,git init 初始化本地仓库
git add ,git commit,都是在当前文件夹下面进行的
只有git push推送到远程仓库(或者本机其余目录下的仓库中[也算远程仓库,只不过是离线的远程仓库])
前提是须要关联本地仓库 与远程仓库
*** git clone 命令时候 默认会作一次关联
没有管理的话,须要咱们本身手动关联***
可是无论远程仓库(net) 远程仓库(本机),本地仓库(某一个文件夹)本质上都是仓库
当Git没法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成
master分支是主分支,所以要时刻与远程同步;
dev分支是开发分支,团队全部成员都须要在上面工做,因此也须要与远程同步;
bug分支只用于在本地修复bug,就不必推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合做在上面开发。
标签是为了打上版本号信息,固然不能乱叫,一般用:
v1.0, v1.1, v2.0 ...
或者按发布日期:
build-20150702, build-20150910 ...
若是你想修复bootstrap的一个bug,或者新增一个功能,马上就能够开始干活,干完后,往本身的仓库推送。
若是你但愿bootstrap的官方库能接受你的修改,你就能够在GitHub上发起一个pull request。固然,对方是否接受你的pull request就不必定了。
有些时候,你必须把某些文件放到Git工做目录中,但又不能提交它们,好比保存了数据库密码的配置文件啦,等等,每次git status
都会显示Untracked files ...
,有强迫症的童鞋内心确定不爽。
好在Git考虑到了你们的感觉,这个问题解决起来也很简单,在Git工做区的根目录下建立一个特殊的.gitignore
文件,而后把要忽略的文件名填进去,Git就会自动忽略这些文件。
不须要从头写.gitignore
文件,GitHub已经为咱们准备了各类配置文件,只须要组合一下就可使用了。全部配置文件能够直接在线浏览:https://github.com/github/gitignore
如忽略
Python编译产生的.pyc
.pyo
.dist
等文件或目录:
git 工做区 和暂存区 各个分支用的是同一个,仅仅提交的时候因为指针指的地方不一样,令咱们感受彷佛在不一样区间上面工做,且git限定咱们 工做区间被修改(如 index.jsp 被修改或被git add可是未 commit) 此时 git是不容许git checkout (切换分支的)
注意关联远程仓库 和 关联 远程分支
**关联远程仓库** git remote add origin git@github.com:wangli0/Appdemo.gitgit **关联远程分支** git branch --set-upstream dev origin/dev
==============版本管理员操做========================
第一步: 建立数据仓库
git init --bare shared.git
==============开发人员1操做=============================
第二步:复制仓库到本地
git clone /f/software/repository/git/shared.git/ . (注意有个点,代表当前目录)
第三步:设置我的信息
git config user.name "user1"
git config user.email "user1@163.com"
第四步:忽略无需版本控制的文档
echo ".txt" > .gitignore
第五步:新建一个文件
echo "User1 add content" > index.jsp
第六步:提交文件
git add index.jsp
git commit -m "User1 add the file"
第七步:把本身的仓库提交到公共服务器
git push origin master
==============开发人员2操做=============================
第八步:复制仓库到本地
git clone /f/software/repository/git/shared.git/ .
第九步:设置我的信息
git config user.name "user2"
git config user.email "user2@163.com"
第十步:忽略无需版本控制的文档
echo ".txt" > .gitignore
第十一步:新建一个文件
echo "User2 add content" >> index.jsp
第十二步:提交文件
git add index.jsp
git commit -m "User2 add the file!"
第十三步:把本身的仓库提交到公共服务器
git push origin master
==============开发人员1操做=============================
第十四步:下载服务器最新数据
git pull
$ mkdir ~/hello-world //建立一个项目hello-world $ cd ~/hello-world //打开这个项目 $ git init //初始化 $ touch README $ git add README //更新README文件 $ git commit -m 'first commit' //提交更新,并注释信息“first commit” $ git remote add origin [git@github.com:defnngj/hello-world.git](mailto:git@github.com:defnngj/hello-world.git) //链接远程github项目 $ git push -u origin master //将本地项目更新到github项目上去
fatal: remote origin already exists.
若是输入$ git remote add origin
git@github.com:djqiang(github账号名)/gitdemo(项目名).git
提示出错信息:fatal: remote origin already exists. 解决办法以下: 一、先输入$ git remote rm origin 二、再输入$ git remote add origin [git@github.com:djqiang/gitdemo.git](mailto:git@github.com:djqiang/gitdemo.git) 就不会报错
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
最近一次的提交
git config --global alias.last 'log -1'
//等价 git log -1
配置文件
配置Git的时候,加上--global是针对当前用户起做用的,若是不加,那只针对当前的仓库起做用。
配置文件放哪了?每一个仓库的Git配置文件都放在.git/config文件中
cat .git/config
git stash命令 stash(隐藏,藏匿)
使用场景:
当你接到一个修复一个bug的任务时,建立一个分支issue-101
来修复它,可是当前正在dev
上进行的工做只进行到一半,还无法提交,可是此时 必须在两个小时内修复该bug,怎么办?
Git还提供了一个stash
功能,能够把当前工做现场“储藏”起来,等之后恢复现场后继续工做
使用说明:
使用
git stash
就能够将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工做区间和上一次提交的内容是彻底同样的,因此你能够放心的修 Bug,等到修完Bug,提交到服务器上后,再使用git stash apply
将之前一半的工做 应用回来
也许有的人会说,那我可不能够屡次将未提交的代码压入到栈中?答案是能够的。
当你屡次使用'git stash'命令后,你的栈里将充满了未提交的代码,这时候你会对将哪一个版本应用回来有些困惑,'git stash list'命令能够将当前的Git栈信息打印出来,你只须要将找到对应的版本号,
例如使用git stash apply stash@{1}
就能够将你指定版本号为stash@{1}的工做取出来,当你将全部的栈都应用回来的时候,可使用'git stash clear'来将栈清空。
在这里顺便提下git format-patch -n , n是具体某个数字, 例如
git format-patch -1
这时便会根据log生成一个对应的补丁,若是 git format-patch -2
那么便会生成2个补丁,固然前提是你的log上有至少有两个记录
看过上面的信息,就能够知道使用场合了:当前工做区内容已被修改,可是并未完成。
这时Boss来了,说前面的分支上面有一个Bug,须要当即修复。但是我又不想提交目前的修改,由于修改没有完成。
可是,不提交的话,又没有办法checkout到前面的分支。此时用Git Stash就至关于备份工做区 了。
而后在Checkout过去修改,就可以达到保存当前工做区,并及时恢复的做用。