写在前面:
主要参考廖雪峰考试的网站学习总结的,强烈推荐
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
1. Git是分布式版本控制系统;集中式的需要联网,分布式就是各自电脑都有一整套代码,保证了安全性,并且也可以设置一个各自修改然后上传统一地方--中央处理器,这样避免了各个电脑之间互传修改过的代码。大家只需要去中央处理器上去取就可以了。
2. 方便版本修改,版本修改都有记录;
3. git在linux上安装:sudo apt-get install git
4. 版本库resipotory----简单理解成一个目录,这个目录里面的所有文件都可以被git管理起来,每个文件的修改、删除,Git都可以跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以还原。
如何创建版本库.....
5. (a) git status命令:让我们时刻掌握仓库当前的状态
(b) git diff xxx命令:查看具体修改了什么内容
(c) 提交到仓库:
1)git add xxxx
2)git commit -m "add distributed"
(d) git log命令:显示从最近到最远的提交日志
简化输出信息:git log --pretty==oneline(一行)
(e) git退回到上一个版本: git reset --hard HEAD^
HEAD:表示当前版本,也就是最新的提交
HEAD^:上一个版本
HEAD^^:上上一个版本
往上100个版本:HEAD~100
(f) git reflog记录你的每一次命令
(g) 如果在回退以后,再想恢复,就必须找到想恢复文件之前的commit id
6. 工作区和暂存区
工作区: 你的电脑里能够看到的目录
版本库:工作区里面的隐藏目录.git
暂存区:Git版本库(.git)里存放的stage(或者叫index)
Git自动为我们创建的第一个分支master,以及指向master的一个指针叫HEAD
git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支
7. git跟踪并管理的是修改,而非文件
第一次修改->git add->第二次修改->git commit 会提交第一次修改的,第二次修改的没有放在暂存区,因而不会被提交
8. git diff HEAD --readme.txt
可以查看工作区和版本库里面最新版本的区别
9. 撤销修改:
git checkout --file:可以放弃之前对工作区的修改
--:这个符号很重要,否则就变成了切换到另一个分支的命令
git checkout -- readme.txt:把readme.txt文件在工作区的修改全部撤销掉,分为两种情况:
(1) readme.txt自修改过后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态
(2) readme.txt已经添加到暂存区后,又做了修改,现在,测下哦修改就回到添加到暂存区后的状态。
git reset命令既可以回退版本,也可以吧咱出去的修改回退到工作区。
git reset HEAD file;
10. 删除文件:
(1) 直接在文件管理器中把没用的文件删了,或者用rm命令删了
(2) Git知道删除了文件,因此工作区和版本库就不一致了
(3) 现在的两个选择:
a) 确实要从版本库中删除该文件,git rm删掉然后git commit
b) 删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本
$git checkout -- test.txt
11. 远程仓库
GITHUB:提供Git仓库托管服务的,只要注册一个GitHub账号,就可以免费获得Git远程仓库
在自己的windows电脑上创建本地仓库时:
git add file添加文件时出现这样错误:fatal: Not a git repository (or any of the parent directories): .git
【解决办法】git init就可以了!
1 Administrator@SZ-20170904JNLT MINGW64 /d/My Documents/Desktop 2 $ cd D:Git 3 4 Administrator@SZ-20170904JNLT MINGW64 /d/Git 5 $ cd ./Git 6 7 Administrator@SZ-20170904JNLT MINGW64 /d/Git/Git 8 $ mkdir learngit 9 10 Administrator@SZ-20170904JNLT MINGW64 /d/Git/Git 11 $ cd ./learngit 12 13 Administrator@SZ-20170904JNLT MINGW64 /d/Git/Git/learngit 14 $ git config --global user.name "wangfei" 15 16 Administrator@SZ-20170904JNLT MINGW64 /d/Git/Git/learngit 17 $ git config --global user.email "573003483@qq.com" 18 19 Administrator@SZ-20170904JNLT MINGW64 /d/Git/Git/learngit 20 $ touch readme.md 21 22 Administrator@SZ-20170904JNLT MINGW64 /d/Git/Git/learngit 23 $ git add readme.md 24 fatal: Not a git repository (or any of the parent directories): .git 25 26 Administrator@SZ-20170904JNLT MINGW64 /d/Git/Git/learngit 27 $ git init 28 Initialized empty Git repository in D:/Git/Git/learngit/.git/ 29 30 Administrator@SZ-20170904JNLT MINGW64 /d/Git/Git/learngit (master) 31 $ git add readme.md 32 33 Administrator@SZ-20170904JNLT MINGW64 /d/Git/Git/learngit (master) 34 $
【安装过程中出现的一些错误及解决办法】
Permanently added the RSA host key for IP address '192.30.252.130' to the list of known hosts.
服务器上刚刚装git,然后拷贝代码出现了上述的问题,这问题很好解决,在hosts文件中加入github.com就可以了
git bash 出现vim的时候怎么退出【类似于linux】
如果是输出状态,首先Esc退出输入状态,然后Shift+;,再输入q!或wq!(不保存改动,wq!是保存文件的写入修改)退出
http://blog.csdn.net/vosang/article/details/50499300
A. 如何将本地仓库的文件代码上传到远程仓库(Github)上面
1 Administrator@SZ-20170904JNLT MINGW64 /d/Git/Git/learngit (master) 2 $ touch secondReadme 6 7 Administrator@SZ-20170904JNLT MINGW64 /d/Git/Git/learngit (master) 8 $ git add secondReadme 9 10 Administrator@SZ-20170904JNLT MINGW64 /d/Git/Git/learngit (master) 11 $ git commit -m 'second commit' 12 [master 585bf6c] second commit 13 1 file changed, 0 insertions(+), 0 deletions(-) 14 create mode 100644 secondReadme 15 16 Administrator@SZ-20170904JNLT MINGW64 /d/Git/Git/learngit (master) 17 $ git push origin master 18 Counting objects: 28, done. 19 Delta compression using up to 4 threads. 20 Compressing objects: 100% (24/24), done. 21 Writing objects: 100% (28/28), 11.92 KiB | 1.99 MiB/s, done. 22 Total 28 (delta 1), reused 0 (delta 0) 23 remote: Resolving deltas: 100% (1/1), done. 24 To github.com:piaxiaohui/learngit.git 25 c56b809..585bf6c master -> master
主要三步
1) git add xxxx
2) git commit -m “注释”
3) git push origin master //push 推(上传)上去,推到远程仓库
提交到gerrit别的分支
$ git push origin master(或者HEAD):refs/heads/FreeWong_branch
B.从远程仓库下载到本地仓库
$ git clone git@github.com:piaxiaohui/FirstDownloadProject.git
12. 分支管理:
(1) 作用: 你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
(2) 在Git里,master分支叫做主分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以HEAD指向的就是当前分支
新建分支dev,并让head现在指向dev,那么对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变
现在将分支合并,只需要将master指向dev的当前提交即可
相关命令:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支: git branch -d <name>
13. 分支管理之解决冲突
14. 分支管理策略
(1) 通常合并分支时,git会用 Fast Forward模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward模式(git merge --no-ff -m "merge with no-ff" dev),Git就会在merge时声称一个新的commot,这样从分支历史上就可以看出分支信息。
(2) 分支策略:
1)master分支应该是非常稳定的,仅用来发布新版本,平时不能在上面干活
2)干活都在dev分支上,然后再合并分支
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并
fast forward合并就看不出来曾静做过合并
15. bug分支
每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后降临时分支删除
命令git stash:把当前工作现场“存储”起来,等到以后恢复现场后继续工作
命令git status:查看工作区
命令git stash list:查看工作现场
恢复之前的stash内容:
方式一:git stash apply: 但是恢复后,stash内容并不删除,需要用git stash drop来删除
方式二: git stash pop,恢复的同时把stash内容也删除了
恢复制定的stash: git stash list
16. Feature分支:主要是用于为master分支添加一些新功能前创建的分支,如果功能接受,再合并
丢弃一个没有被合并过的分支,可以通过git branch -D<name>强行删除
17.多人协作
(1) 查看远程库(origin)的信息 git remote/git remote -v(显示更详细的信息)
(2) 推送分支,就是把该分支上的所有本地提交推送到远程库,推送时要指定本地分支
$ git push origin master
(3) master分支和dev分支需要时刻与远程同步,bug分支和feature分支不需要与远程时刻同步
(4)当你的小伙伴要在远程dev分支上开发,就必须创建远程origin的dev分支到本地
$ git checkout -b dev origin/dev
因此,多人协作的工作模式通常是这样:
-
首先,可以试图用
git push origin branch-name
推送自己的修改; -
如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; -
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用
git push origin branch-name
推送就能成功!
如果git pull
提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch - -set-upstream branch-name origin/branch-name
。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
17. 标签管理
发布一个版本时,我们通常现在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.
Git标签虽然是版本库的快照,但其实他就是指向某个commit的指针.
1-> Git中打标签流程
(1) 首先,切换到需要打标签的分支上
git checkout xx(比如master)
(2) 然后 git tag <name>
(3) git tag 查看所有标签
(4)给之前的commit打标签
1)先找到历史提交的commit id
git log --pretty=oneline --abbrev -commit
2 ) 然后 git tag v0.9 6224937[commit id]
(5) 查看标签的详细信息:
git show <tagname>
(6)可以创建带有说明的标签
$ git tag -a v0.1 -m “version 0.1 released” 3628164
-a:表示制定标签名
-m:指定说明文字
2-> 操作标签
1) 删除打错的标签:git tag -d v0.1
2) 推送某个标签到远程: git push origin <tagname>
一次性推送全部尚未推送到远程的本地标签:git push origin --tags
3) 要删除远程的标签:
第一步,先从本地删除 git tag -d v0.9
第二步,再从远程删除 git push origin:refs/tags/v0.9<tagname>
要看看是否真的从远程库删除了标签,可以登陆GitHub查看
4)要删除以后的GitHub的远程库:git remote rm origin
18. 自定义Git
(1) 让Git显示颜色:
git config --global color.ui true
(2) 忽略某些文件时,需要编写.gitignore【最好用文本编辑器创建】
.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理
(3)设置命令简写
单个单词命令:
git st就能表示git status
$ git config --global alias.st status
多个单词命令:
$ git config --global alias.usage 'reset HEAD'
(4) 配置git的时候,加上--global时针对当前用户起作用的,如果不加,那只针对当前的仓库器作用
每个仓库的Git配置文件都放在.git/config文件中
当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中