1.初始化仓库
git init
如果遇到以下问题:
*** Please tell me who you are. Run git config --global user.email "you@example.com" git config --global user.name "Your Name" to set your account's default identity. Omit --global to set the identity only in this repository. fatal: unable to auto-detect email address (got 'xxx@xxx.(none)')
需要配置用户名和邮箱:
git config user.name “username”
git config user.email “email”
2.提交代码
git add .
git commit -m “”
3.查看状态
git status
4.查看修改
git diff
-change something
+change
5.查看提交历史
git log
commit acbcfcfa48c89deb725aae9e03a68a2f5abaa1d4 Author: gcl <155@163.com> Date: Tue Feb 7 14:30:11 2017 +0800 change 2 commit 99f733644454644d90b8ee39c6737dc283c78cec Author: gcl <155@163.com> Date: Tue Feb 7 14:27:55 2017 +0800 change readme.txt commit 58110376e350d36c8df095b17ff2ecb44906eae2 Author: gcl <155@163.com> Date: Tue Feb 7 14:25:17 2017 +0800 add readme.txt
简化版本信息:git log --pretty=oneline
acbcfcfa48c89deb725aae9e03a68a2f5abaa1d4 change 2 99f733644454644d90b8ee39c6737dc283c78cec change readme.txt 58110376e350d36c8df095b17ff2ecb44906eae2 add readme.txt
6.回退版本
HEAD指向当前版本,HEAD^是上一版本,HEAD^^是上上版本,HEAD~100是上100个版本
回到上一版本:git reset --hard HEAD^
回到某一历史:git reset --hard commitid
7.查看命令历史
git reflog
acbcfcf HEAD@{0}: reset: moving to acbcfcfa4 99f7336 HEAD@{1}: reset: moving to HEAD^ acbcfcf HEAD@{2}: commit: change 2 99f7336 HEAD@{3}: commit: change readme.txt 5811037 HEAD@{4}: commit (initial): add readme.txt
8.工作区与暂存区
respository文件夹:工作区
.git:版本库,包含了stage(暂存区),分支master,指针HEAD
git add是把文件修改放到了暂存区,git commit把暂存区的内容提交到了分支,没有提交到暂存区的修改是不会被提交到分支的
提交的事件线:工作区->git add->暂存区->git commit->分支
9.撤销修改
(1)撤销add前在工作区的修改:git checkout -- readme.txt
(2)撤销add后,commit前在暂存区的修改:git reset HEAD readme.txt
reset可以回退版本,还可以撤销add到暂存区的内容,重新回到工作区,可以再次checkout -- 来撤销在工作区的修改
(3)撤销commit之后,push之前:git reset
10.删除文件
git rm
git commit
撤销删除,找回文件:git checkout -- filename
git checkout:使用版本库中的最新版本替换工作区的版本,即撤销git add/rm之前的修改
11.github使用
1)在http://git.oschina.net创建库:
(1)ssh-keygen -t rsa -C "xxxxx@xxxxx.com"# Creates a new ssh key using the provided email
# Generating public/private rsa key pair...
(2)cat ~/.ssh/id_rsa.pub
# ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6eNtGpNGwstc.... 将public key添加
(3)ssh -T git@github.com (github)
ssh -T git@git.oschina.net (oschina)
Welcome to Git@OSC, yourname!
2)为github上的开源仓库贡献代码:
(1)fork:在GitHub上,可以任意Fork开源仓库
(2)提交修改到自己帐号上的仓库:自己拥有Fork后的仓库的读写权限
(3)pull request:可以推送pull request给官方仓库来贡献代码
12.远程仓库
(1)本地库origin与远程库learngit关联,origin为git的默认叫法
git remote add origin git@github.com:XXX/learngit.git(XXX为你的github账户名)
(2)将本地库中的所有内容推送到远程库中,加上-u将本地master分支和远程master分支关联起来,以后推送就可以直接使用git push简化命令
git push -u origin master
(3)以后推送使用以下命令
git push origin master
(4)把远程库克隆到本地,使用https速度慢,而且每次都要输入口令
git clone ssh或https
(5)push与pull
push:本地 --> 远程,如果本地超前远程,需要push
13.分支
(1)创建分支:将当前分支中的所有文件拷贝到新分支
git branch second
切换到分支
git checkout second
创建+切换到分支:-b
git checkout -b second
(2)查看当前分支
git branch
(3)合并指定分支到当前分支
git merge second
撤销合并操作:
git reset
(4)删除分支
git branch -d second
git branch -D second:强行删除一个没有合并过的分支
git push origin --delete second 删除远程分支
(5)合并分支默认使用”fast forward”模式,合并后看不出做过合并,禁用”fast forward” 使用普通模式,合并后的历史可以看出曾经做过合并。禁用”fast forward”并且加上了commit描述:
git merge --no-ff -m "merge with no-ff" second
(6)分支管理策略
(7)本地分支:master,dev,bug,feature(最好在开发新功能时为每一个新功能创建一个分支)
远程分支:origin,dev
14.解决冲突
(1)查看冲突
git status
(2)查看分支合并图 git log --graph
git log --graph --pretty=oneline --abbrev-commit
(3)合并分支发生冲突后,解决冲突步骤:查看冲突->修改->提交->合并完成
15.bug分支:将当前无法提交到现场先保存起来,使工作区回复clean状态,修复bug后,再将保存的东西解开
(1)将工作现场先保存起来:git stash
(2)查看保存现场记录:git stash list
(3)恢复工作线程
git stash apply :stash内容不删除,需要使用 git stash drop手动删除
git stash pop:恢复的同时将stash的内容删除
git stash apply stash@{0}:有多个stah时,指定恢复到某个stash
16.多人协作
(1)查看远程分支
git remote
查看远程分支详细信息
git remote -v
(2)推送分支:将本地某个分支中的所有提交推送到远程库
git push origin master
(3)从远程抓取新提交
git pull
注意:如果git pull时
提示“no tracking information”,则需要指定本地master/dev
分支与远程origin/dev
分支的链接后,才能pull
git branch --set-upstream dev origin/dev 已弃用,
更新为: git branch --set-upstream-to=origin/dev dev
(4)多⼈人协作的⼯工作模式通常是这样:
- 首先,可以试图⽤git push origin branch-name推送⾃自⼰己的修改;
- 如果推送失败,则因为远程分⽀支⽐比你的本地更新,需要先⽤用git pull试图合并;
- 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再⽤用git push origin branch-name推送就能成功!
17. 标签
(1)添加标签:切换到指定分支后,git tag v1.0
(2)查看所有标签:git log --pretty=oneline --abbrev-commit
(3)补加标签:找到commitid后添加标签,git tag v0.9 commitid
注意,标签不是按时间顺序列出,而是按字母排序的。
(4)查看某一标签信息:git show v0.9
(5)添加标签时添加说明,用-a
指定标签名,-m
指定说明文字:
git tag -a v0.1 -m "version 0.1 released" 3628164
(6)用私钥签名一个标签:
git tag -s v0.2 -m "signed version 0.2 released" fec145a
(7)删除标签
git tag -d v1.0
(8)将本地某一标签推送到远程:
git push origin v1.0
推送本地所有未推送到远程的标签:
git push origin --tags
(9)删除远程标签:需要先删除本地标签
git tag -d v1.0
git push origin :refs/tags/v1.0
18.自定义git
(1)配置用户名和email
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
(2)给git命令添加颜色
git config --global color.ui true
(3)忽略特殊文件:添加.gitignore
强制添加被忽略的文件:git add -f App.class
查看想添加的文件被.gitignore中的哪条规则忽略了:git check-ignore -v App.class
(4)配置别名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.unstage 'reset HEAD'
git config --global alias.last 'log -1'
git config --global alias.lg "log --color --graph --
注意:--global
是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用
(5)配置文件
每个仓库的Git配置文件都放在.git/config
文件中,查看配置文件:cat .git/config
要删除别名,直接把对应的行删掉即可
改错了,可以删掉文件重新通过命令配置
19.自己搭建git服务器
(1)安装git
sudo apt-get install git
(2)创建一个
git
用户,用来运行git
服务
sudo adduser git
(3)创建证书登录
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub
文件,把所有公钥导入到/home/git/.ssh/authorized_keys
文件里,一行一个
(4)初始化Git仓库
sudo chown -R git:git sample.git
(5)禁用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
每次一登录就自动退出。
(6)克隆远程仓库
git clone git@server:/srv/sample.git
(7)要方便管理公钥,用Gitosis;
要像SVN那样变态地控制权限,用Gitolite。
Git的官方网站:http://git-scm.com
附Unix命令:
(1)创建文件夹:mkdir
(2)跳到指定路径:cd
(3)查看当前完整路径:pwd
(4)查看当前路径下的所有文件及文件夹:ls
(5)cat:可以显示文件内容,但是不能编辑
(6)touch:如果文件存在,使用touch指令可更改这个文件或目录的日期时间,包括存取时间和更改时间;
如果文件不存在,touch指令会在当前目录下新建一个空白文件
(7)vi/vim:打开文件后可以编辑
(8)echo:输出
本文为阅读廖雪峰的官方网站中的git教程的学习笔记,仅为自己的一点学习记录,原文写的非常好,作者很厉害,有兴趣的朋友可以阅读原文:廖雪峰的官方网站的git教程
pull:本地 <-- 远程,如果本地落后远程,需要要pull