简介
- Git是目前世界上最先进的分布式版本控制系统(没有之一)(用C写的)。
- Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
- CVS、SVN是免费的集中式的版本控制系统,不但速度慢,而且必须联网才能使用。
- msysgit是Windows版的Git,从https://git-for-windows.github.io下载。
- 所有的版本控制系统,其实只能跟踪文本文件的改动;如果要真正使用版本控制系统,就要以纯文本方式编写文件。
- 不要使用Windows自带的记事本编辑任何文本文件,建议下载Notepad++代替记事本,把Notepad++的默认编码设置为UTF-8 without BOM即可。
- 提交修改和提交新文件是一样的两步。
- 在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0,上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。
- 撤销修改:
- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
- 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
- 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
- 远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
- Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。
- 分支策略:在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。 - 在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定:
- master分支是主分支,因此要时刻与远程同步;
- dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
- bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
- feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
- 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交。
- 配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
- 每个仓库的Git配置文件都放在.git/config文件中,别名就在[alias]后面,要删除别名,直接把对应的行删掉即可;而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中,配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。
- 如何参与一个开源项目呢?比如人气极高的bootstrap项目,这是一个非常强大的CSS框架,你可以访问它的项目主页,点“Fork”就在自己的账号下克隆了一个bootstrap仓库,然后,从自己的账号下clone:git clone git@github.com:michaelliao/bootstrap.git,一定要从自己的账号下clone仓库,这样你才能推送修改。如果从bootstrap的作者的仓库地址git@github.com:twbs/bootstrap.git克隆,因为没有权限,你将不能推送修改。
- .gitignore文件自己配置,把不想上传的文件或文件夹的名字写在.gitignore里面就行了,每行写一个名字,#号是注释,在后缀名(如.css)后面加星号(*),可以忽略所有是这个后缀的文件。
- 多人协作:自己创建好仓库,在所创建仓库的setting里添加协作者,被添加的从这个仓库clone到本地就可以修改了。
- git不能push空文件夹,可以在空文件夹里面加个.gitkeep文件。
命令行常用命令
- $ pwd 显示当前目录;
- $ mkdir learngit 创建learngit目录;
- $ cd learngit 即指定learngit为当前目录;
- $ ls -a 列出当前目录下的所有子目录;
- $ ls -al ./.ssh 检查.ssh是否存在($ ls -al ~/.ssh);
- ctrl+insert 复制;
- shift+insert 粘贴;
- 方向上下箭头可选择使用过的命令;
- ctrl+c 退出当前命令;
- $ vi readme.txt 进入readme.txt编辑区普通模式,i 进入插入模式,esc返回普通模式,:q退出,:q!不保存退出,:wq保存并退出。
- $ vi fileName.py 如果开始时fileName.py不存在,则是创建了fileName.py文件;
- $ cat readme.txt 会把文件内容打印到屏幕;
- $ cat > readme.txt 可以向readme.txt输入内容,输入的内容会替换掉原有内容,按ctrl+d结束输入,会将输入的内容保存到文件。
- $ touch fileName 创建文件fileName;
- $ wc (Word Count) 字数信息统计,如 wc index.html;
- $ more less 查看文件,如more /etc/passwd、less /etc/passwd;
- $ mv (move) 移动文件或重命名,如 mv index.html ./demo/index.html;
- $ cp (copy) 复制文件,cp index.html ./demo/index.html;
- $ head 查看文件前几行,如 head -5 index.html;
- $ tail 查看文件后几行 –n –f,如 tail index.html、tail -5 index.html
- $ tab 自动补全,连按两次会将所有匹配内容显示出来;
- $ history 查看操作历史;
- $ ssh 远程登录,如ssh root@gitlab.study.com (此处root是用户名);
- $ > 和 >>重定向,如echo hello world! > README.md,>覆盖 >>追加;
- $ wget 下载,如wget https://nodejs.org/dist/v4.4.0/node-v4.4.0.tar.gz;
- $ tar 解压缩,如tar zxvf node-v4.4.0.tar.gz;
-$ curl 网络请求,如curl http://www.baidu.com; - $ who am i 查看当前用户;
- $ | 管道符;
- $ grep 匹配内容,一般结合管道符使用;
vi编辑器常用命令
- 命令行模式命令:
- $ ZZ(大写) 保存并退出;
- $ u 辙销操作,可多次使用;
- $ dd 删除当前行;
- $ yy 复制当前行;
- $ p 粘贴内容;
ctrl+f 向前翻页;
ctrl+b 向后翻页; - $ i 进入编辑模式,当前光标处插入;
- $ a 进入编辑模式,当前光标后插入;
- $ A 进入编辑模式,光标移动到行尾;
- $ o 进入编辑模式,当前行下面插入新行;
- $ O 进入编辑模式,当前行上面插入新行;
- 底行模式命令:
- :w 保存;
- :w filenme另存为;
- :q 退出;
- :wq 保存并退出;
- :e! 撤销更改,返回到上一次保存的状态;
- :q! 不保存强制退出;
- :set nu 设置行号;
git常用命令
- $ git init 把当前目录变成Git可以管理的仓库;
- $ git add readme.txt 用命令git add告诉Git,把文件添加到仓库;
- $ git add . 把所有需要add的文件全add了;
- $ git commit -m "wrote a readme file" 用命令git commit告诉Git,把文件提交到仓库(-m后面输入的是本次提交的说明,可以输入任意内容);
- $ git status 可以让我们时刻掌握仓库当前的状态;
- $ git diff 可以查看修改内容;
- $ git log 显示从最近到最远的提交日志;
- $ git log -1 显示最后一次的提交日志;
- $ git log --pretty=oneline 相对简洁的显示提交日志;
- $ git reset --hard HEAD^ 回退到上一个版本;
- $ git reset --hard commit_id 回退到commit_id版本(版本号没必要写全,前几位就可以了,Git会自动去找);
- $ git reflog 查看命令历史,以便确定要回到未来的哪个版本;
- $ git checkout -- readme.txt 把readme.txt文件在工作区的修改全部撤销(修改后还没有被放到暂存区);
- $ git checkout 切换到另一个分支;
- $ git reset HEAD readme.txt 可以把暂存区的修改撤销掉(unstage),重新放回工作区,再$ git checkout -- readme.txt即可;
- $ rm test.txt 从工作区删除test.txt文件;
- $ rmdir (Remove Directory) 删除文件夹,只能删除空文件夹,不常用;
- $ git rm test.txt 从版本库中删除该文件,并且git commit;
- $ git checkout -- test.txt 把工作区误删的文件恢复到版本库里的最新版本(用版本库里的版本替换工作区的版);
- $ ssh-keygen -t rsa -C "youremail@example.com" 创建SSH Key;
- $ eval $(ssh-agent -s) 确认ssh-agent是可用的;
- $ ssh-add ~/.ssh/id_rsa 将ssh key添加到ssh-agent;
- $ clip < ~/.ssh/id_rsa.pub 复制id_rsa.pub的内容;
- $ ssh -T git@github.com 验证是否配置成功;
- $ ssh -T -v git@github.com SSH的debug命令;
- $ git remote show 查看远程仓库的别名,如origin;
- $ git remote add origin git@github.com:michaelliao/learngit.git 本地仓库关联远程库(前面的michaelliao替换成你自己的GitHub账户名)(给远程仓库起别名origin);
- $ git clone git@github.com:michaelliao/gitskills.git 克隆一个本地库;
- $ git push -u origin master 把本地库的所有内容推送到远程库上,第一次推送master分支时,加上了-u参数(把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。);
- $ git push origin master 把本地master分支的最新修改推送至GitHub;
-
分支管理:
- $ git branch 查看分支,会列出所有分支,当前分支前面会标一个*号。;
- $ git branch <name> 创建分支;
- $ git checkout <name> 切换分支;
- $ git checkout -b <name> 创建+切换分支;
- $ git merge <name> 合并某分支到当前分支;
- $ git branch -d <name> 删除分支;
- $ git branch -D <name> 强行删除;
- $ git log --graph --pretty=oneline --abbrev-commit 用带参数的git log也可以看到分支的合并情况;
- $ git merge --no-ff -m "merge with no-ff" dev 准备合并dev分支,--no-ff参数表示禁用Fast forward,因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去;
- $ git stash 把当前工作现场“储藏”起来,等以后恢复现场后继续工作;
- $ git stash list 查看工作现场被存到哪里去了;
- $ git stash pop 恢复的同时把stash内容也删了(用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除);
- $ git stash apply stash@{0} 可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash;
- $ git remote 查看远程库的信息;
- $ git remote show 查看远程仓库别名(origin);
- $ git
- $ git remote -v 显示更详细远程库的信息;
- $ git checkout -b branch-name origin/branch-name 在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致(这个命令失败了不知原因,替代方法本地先创建branch-name,直接推送到远程的这个分支上即可);
- $ git pull 用git pull把最新的提交从origin/dev抓下来;
- $ git branch --set-upstream-to=origin/dev 设置本地dev和origin/dev的链接(建立本地分支和远程分支的关联);
$ git tag v1.0 打一个新标签(默认标签是打在最新提交的commit上的);
$ git tag v0.9 6224937 其中6224937是commit id,
$ git tag 查看所有标签,标签不是按时间顺序列出,而是按字母排序的;
$ git show <tagname> 查看标签信息;
$ git tag -a v0.1 -m "version 0.1 released" 3628164 创建带有说明的标签,用-a指定标签名,-m指定说明文字;
$ git tag -s v0.2 -m "signed version 0.2 released" fec145a 通过-s用私钥签名一个标签(签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错,用PGP签名的标签是不可伪造的,因为可以验证PGP签名);
$ git tag -d <tagname> 删除一个本地标签;
$ git push origin :refs/tags/<tagname> 删除一个远程标签;
$ git push origin <tagname> 推送一个本地标签;
$ git push origin --tags 可以推送全部未推送过的本地标签;
$ git config --global color.ui true 让Git显示颜色,会让命令输出看起来更醒目;
$ git add -f App.class 强制添加文件;
$ git check-ignore -v App.class 检查.gitignore的哪个规则写错了;
$ git config --global alias.st status 配置别名,st就表示status;
$ git config --global alias.last 'log -1' 长命令加单引号;
$ cat .git/config 每个仓库的Git配置文件都放在.git/config文件中;
$ cat .gitconfig 当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中;
小结
- 在这里强烈推荐廖雪峰大神的个人网站,里面有各种你想要的干货!廖大神个人网站入口: http://www.liaoxuefeng.com/ 。