Git
写在前面
万恶的SC,什么都要自己学,下面更多的是我学的东西的总结,有一篇很好的文章(点这里跳进去),远程谢谢博主!
简介
Git可以理解为一个可以帮你把一个大项目中过去的版本上传到网上(Github)并且帮助管理的软件。
Git是Linus用C花了两周的时间写出来的…
版本控制系统分为两种,一种是集中式一种是分布式,集中式就是有一台中央服务器能完成不同贡献合并的工作,每次大家都只取一部分下来干。
分布式是每个人都有一个完整的项目文件,然后自己写自己的,写完了相互传来传去,分布式系统会在这个过程中合并代码,其中可能有一个方便大噶传来传去的电脑(不干其他事,纯粹方便)。
常用命令
在官网上面下就可以了,注意安装好之后要设置用户名和邮箱。
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
现在开始建仓库了,先找到一个安静的地方,做出一个用于存放东西的目录,cd进这个目录(命令pwd可用显示于当前目录)。
注意git中使用的工作区,暂存区和提交的概念。
下面是常用命令
git init
/* 可以将一个目录转化为git仓库
创建成功后会出现一个一个隐藏文件夹.git用于存放git信息*/
git add
/*1.可以将工作区的文件放入暂存区(stage)
2.可以将未跟踪文件放入已跟踪文件*/
git commit -m "提交内容"
/*将所有暂存区里面的修改提交*/
git status
/*查看文件状态*/
git diff 文件名
/*查看未放入暂存区的修改*/
git diff HEAD -- 文件名
/*查看工作区文件和版本文件之间修改内容*/
git log (--prety=oneline)
/*查看修改日志*/
git log --graph --pretty=oneline --abbrev-commit
/*图形化查看分支*/
版本控制
Git的版本控制相当于将不同的提交版本抽象为节点,HEAD指针指指向当前版本的节点,创建新节点,回退,FF模式下的合并只移动HEAD指针,所以非常快。
git reset --hard HEAD~(数字x)
git reset --hard HEAD^
git reset --hard HEAD^^
git reset --hard 版本号(git可以自动补全)
/*第一个是回退x个版本,第二个是回退一个版本,第三个是回退两个版本
--hard会清空暂存区,将版本的所有文件放入工作区*/
git reflog
/*记录了每一次命令,可以通过这个来找回之前的版本号*/
git checkout
/*用当前版本替换工作区中的内容*/
git checkout -- file
/*场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时*/
git reset HEAD file
/*场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时
想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作*/
/*场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节*/
git rm file
/*告诉git你真的删掉了一个文件*/
更多reset回退方式点这里
远程仓库
创建SSH-key,并且绑GitHub,id_rsa是私钥,id_rsa.pub是公钥
ssh-keygen -t rsa -C "youremail@example.com"
Origin是远程仓库的名字,下面添加远程仓库的名字
git remote add origin git@github.com:用户名/仓库名.git
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
git push -u origin master
git push -u origin master -f
/*使用强制push,这样会使远程修改丢失,一般是不可取的,尤其是多人协作开发的时候*/
从现在起,只要本地作了提交,就可以通过命令:
git push origin master
把本地master分支的最新修改推送至GitHub。
从远程仓库克隆,下到自己的电脑上作为一个文件夹
git clone git@github.com:用户名/仓库名.git
分支管理
由于不完整的代码会给团队开发带来困难,破坏原来已经开发的东西很不划算,每个人在开发的时候会创建一个新的分支,在新的分支上开发完成之后再将自己的分支合并到主分支上。master分支最稳定,用于发布新版本,dev分支是开发的总分支,不同的人开发完成后将自己的分支合并到dev分支上,完成测试后再合并到master分支上.
git采用指针的形式,可以很快地创建和合并分支。创建分支dev,并且移动到dev上的命令
git checkout -b dev
/*git checkout命令加上-b参数表示创建并切换,相当于下面两条命令*/
git branch dev
git checkout dev
git branch
/*查看当前的分支*/
常用的分支控制命令
git merge dev
/*现在master分支上,要把dev合并到master分支上来
git merge --no-ff -m "提交信息" dev
禁用FF模式,可以添加合并信息*/
git branch -d dev
/*删除dev分支,-D 强行删除*/
git log --graph
/*分支合并图*/
如果想把当前的工作区所有文件存起来还可以
git stash
/*将当前工作区所有文件存入临时栈中*/
git stash list
/*查看临时栈*/
git stash pop
/*弹出并删除顶层临时工作状态*/
git stash apply stash@{编号}
/*恢复特定编号的工作状态,不删除栈中工作状态*/
git stash drop stash@{编号}
/*删除特定编号的工作状态*/
Github
在GitHub上,可以任意Fork开源仓库
自己拥有Fork后的仓库的读写权限
可以推送pull request给官方仓库来贡献代码
自定义Git
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。例如
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
# My configurations:
db.ini
deploy_key_rsa
忽略后的文件无法被add,-f可以强制add
git add -f App.class
检查要add的文件被哪个ignore命令忽略了
git check-ignore -v file.suffix
可以自定义命令别名
git config --global alias.自定义命令 "原来命令"
/*我设置了下面两三个*/
/*git lg*/
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 glog*/
git config --global alias.glog "log --graph --pretty=oneline --abbrev-commit"
/*git st*/
git config --global alias.st "status"
配置Git的时候,加上–global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。每个仓库的Git配置文件都放在.git/config文件中。别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中。配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。
原文里面还有教搭Git服务器的内容!