安装:
查看是否安装git:
$ git
未安装,输入命令:
$ sudo apt-get install git 或者
$ sudo apt-get install git-core
创建版本库并添加文件
$ mkdir learngit
$ cd learngit
$ pwd (显示当前目录)
$ git init
$ ls -ah (显示隐藏目录)
$ git add something (添加something到git仓库,这里的something必须先手动拖到git仓库中)
$ git commit -m "write something" (提交文件,“”里填写修改内容,方便查看日志)
注意:add 可以多次使用,添加多个文件,但commit只需要执行一次就能提交所有修改
操作命令:
$ git status (显示当前仓库状态,是否有修改内容,是否需要提交,没有git add并且没有git commit的修改,或者只进行了git add没有git commit的操作)
$ git diff (显示未被提交的文件修改内容,没有git add的修改)
每次提交修改都需要执行 add和commit命令
commit提交相当于一次记录,记录的是当前提交时的文件状态,所以在这里可以回到之前的某一个状态,以便撤销错误的修改
$ git log (查看最近到最远的提交日志)
$ git log --pretty=oneline (简洁的输出提交日志)
在这里,会出现一个比较长的符号,这个符号就是commit id的版本号,
版本控制
HEAD来表示当前的版本,HEAD^表示上一个版本 ,HEAD~100表示往上100个版本
$ git reset --hard HEAD^ (命令,回到之前的某一个版本,这里回到了上一个版本)
$ cat something (查看文件内容)
由于回到了上一个版本了,所以最新的版本已经没有了,如果想要到刚才的版本需要找到它的版本号,并且执行命令
$ git reset --hard 111111 (这里111111代指版本号)
注意:-- 和hard之间没有空格!!!!
$ git reflog (记录之前的每一次命令)
$ more something (查看文件内容)
$ git reset --hard (查看当前HEAD指针指向的版本号)
这里的指针,指的是,每一个版本其实对应的是一个指针,当使用命令 git reset -- hard 时,其实就是在改变这个指针地址
操作区和暂存区
工作区:就是创建的git仓库
版本库:工作区中的隐藏目录 .git ,版本库里存储了暂存区(stage)、分支(master)、指向分支的指针(HEAD)
解析:git add ------- 把文件修改添加到暂存区
git commit ------- 把暂存区的所有内容提交到当前分支
管理修改
git管理的是修改并非文件
$ git diff HEAD -- readme.txt (查看工作区和版本库里面最新版本的区别)
撤销修改
三种情况:
1、只是修改了没有git add ----------- $ git checkout -- something
2、不仅修改了还git add了 ------------ $ git reset HEAD something
$ git checkout -- something
3、不仅修改了还git add了并且还git commit了 ------------ 看前面的版本控制
删除文件
两种情形:
1、确认删除:
$ rm something (这里只是删除了工作区的文件,但是版本库里的文件并没有删除)
$ git rm something
$ git commit -m "remove something" (从版本库里删除文件,现在文件已经彻底删除了)
2、取消删除
$ rm something (工作区文件删除,但是想取消删除,可以将还未从版本库里删除的文件取出放到工作区)
$ git checkout -- something (取消删除)
注意:git checkout命令是一个撤销命令,可以撤销修改也可以撤销删除
远程仓库
github网站托管代码,需要注册账号
1、创建SSH Key,
$ cd/Users/admin/ (用户主目录)
$ ls -ah (查看隐藏目录) ------- 查找是否有目录:.ssh
如果有.ssh目录:在.ssh中有文件id_rsa(私钥),id_rsa.pub(公钥),
登陆github,打开Account settings -- SSH Keys页面将id_rsa.pub里的内容复制到key中,点击Add Key ----- 添加成功
如果没有.ssh目录:
$ ssh-keygen -t rsa -C "" (""中填写自己的邮件地址,一路回车)
注意:github是免费托管的git仓库,任何人都可以查看上传的代码(但,如果没有把key添加到github上就无法提交),只有交费或者自己搭建的git仓库才能不对外公开
添加远程仓库
1、登陆github 右上角点击create repository
2、给git仓库命名
3、$ git remote add origin git@github.com:name/learngit.git
注意:name为关联的github账户名,origin为远程库的名字
4、把本地库的内容推送到远程库上
$ git push -u origin master
注意:git push为推送命令,把当前分支推送到远程仓库origin中,并且建立远程分支master,只有在第一次推送,即远程库是空的的时候,才会在git push后面添加参数-u
5、代码提交
$ git push origin master
从远程库克隆
1、$ git clone git@github.com:name/gitname.git
注:name为github账户名,gitname为要克隆的仓库
另外:$ git clone https://github.com/name/skill.git命令同样可以实现,但是https速度慢,并且每次推送都需要口令。
分支管理
分支管理对于多人开发意义重大,使用分支管理可以让不同的开发人员在不同的分支中提交自己的代码,这样就不会影响别人的提交,当分配的任务完成后,再统一合并分支,这样可以有效的提高工作效率
创建与合并分支
$ git checkout -b dev (创建dev分支并切换到dev分支)
注:这里的命令相当于命令:$ git branch dev (创建分支dev)
$ git checkout dev (切换到分支dev)
$ git branch (查看所有分支和当前分支)
$ git checkout master (切换到分支master)
注:当在分支dev中进行修改并提交后,分支master中文件并不会发生改变,只有在执行合并分支后才会对master分支里的文件进行修改
$ git merge dev (把dev分支合并到master分支)
注意:这里的合并方式只是合并方式中的一种,Fast-forward快进模式
$ git branch -d dev (删除dev分支)
解决冲突
当两次提交的文件有差异的时候,无法快速合并,只能将各自的修改合并起来,使用命令git status,可以查看冲突文件,并且打开文件,可以看到,git用<<<<<<<<<,===========,>>>>>>>>>>>标记出了不同分支的内容,
我们需要手动把标有<<<<,=====,>>>>>符号的代码修改为正确的代码,然后提交,
并且可以用命令:$ git log --graph --pretty=oneline --abbrev-commit 查看分支的合并情况
最后需要删除其中一个分支
分支管理策略
这里的策略是指在不删除分支的条件下,进行分支合并
$ git merge --no-ff -m "change something" dev
注:命令 --no-ff参数表示禁用 Fast forward,这种合并方式,不会删除分支dev,并且上面的命令表示:合并分支,并且创建一个新的commit,所以需要添加一个-m参数
分支阶段性总结
假设有分支master和其他分支,这里的master应该是非常稳定的,仅仅用来发布新的版本,平时要在其他的分支上面工作,
创建新的分支dev,这个dev分支就是工作分支,dev分支不稳定,每个人都有自己的分支,都在这个分支上工作,并且时时将代码提交到dev分支
bug分支
假定现在的主分支为:master分支,有分支dev正在进行开发工作,并且没有进行代码提交,但是原来的代码中出现了bug-101,需要马上修改,进行如下操作:
1、在dev分支中执行代码:$ git stash (储藏工作现场,执行完成后工作区清空)
2、在master中新建分支issue-101,对bug-101进行修改,修改结束后提交并合并到master中。
3、在dev中执行命令:$ git merge --no-ff -m "merge master" master (把修改后的master分支合并到dev分支中)
4、回到分支dev中,执行命令:$ git stash pop (恢复并删除stash内容)
或者:$ git stash apply (恢复)
$ git stash drop (删除)
5、在dev中继续工作
6、在master中执行命令:$ git merge --no-ff -m "merge dev" dev (把dev分支合并到master分支中)
注意:
如果在dev分支和issue-101分支操作的是同一个文件,可能会产生冲突,所以这种情形下,只能是不同文件才能这样操作,上面的3过程可以不执行。
强制删除分支
$ git checkout -b feature-vulcan (在分支dev下创建并切换到feature-vulcan分支,进行开发)
$ git add file (将文件file添加到暂存区)
$ git commit -m "" (将文件file提交到当前分支fenture-vulcan)
$ git checkout dev (切换到主分支dev)
现在,由于计划变更,取消feature-vulcan里的修改
$ git branch -d feature-vulcan (销毁失败,由于feature-vulcan分支还没有被合并,所以拒绝删除分支)
$ git branch -D feature-vulcan (删除成功,强制删除可以忽略拒绝信息)
多人协作
$ git remote (查看远程库的信息)
$ git remote -v (显示详细的远程库信息)
$ git push origin master (将本地分支上传到远程origin仓库的master分支)
pull命令
$ git clone git@github.com:name/learngit.git (多人合作时,使用该命令将账号名为name下的learngit远程仓库内的所有内容下载到当前目录)
注意:如果想要使用clone命令下载远程文件到当前目录需要先添加该远程仓库到本地:
$ git remote add origin git@github.com:name/review.git (将远程仓库添加到本地并命名为origin)
此时,该目录下使用命令:$ git branch 只会显示一个分支:master,并且在该分支下只能push到远程仓库中的master分支中
$ git checkout -b dev origin/dev (创建远程仓库origin的dev分支到本地,在这个dev本地库中无法上传代码到其他的远程仓库,只能到origin/dev)
$ git add file
$ git commit -m "change something"
$ git push origin dev (push修改内容到远程仓库)
假如此时别人也同时修改了文件file并且push到了同一个仓库中,那么会产生冲突,解决方法:
$ git branch --set-upstream dev origin/dev (将本地分支dev与远程仓库origin中的dev分支链接)
$ git pull (该方法是将最新代码抓取到本地,并合并)
在执行上面的代码之前需要指定本地分支与远程分支的链接,否则pull会失败)
手动解决冲突后提交代码
标签管理
标签就是一个版本,或者一个时间点,记录了这个时间点之前的代码,可以随时添加、删除
创建的标签只能存储在本地,不会自动推送到远程,必须通过命令才能上传标签
$ git branch (显示所有分支)
$ git checkout master (切换到master分支)
$ git tag v1.0 (新建标签)
$ git tag (查看所有标签,标签按照字母顺序排列)
注意:如果之前忘记打标签了,可以找到历史提交的commit id,查找当时的id,并且打标签
$ git log --pretty=oneline --abbrev-commit
$ git tag v0.9 id (这里的id是多对应的commit id)
$ git show v0.9 (查看标签信息)
$ git tag -a v0.1 -m "version 0.1 released" id (给标签添加说明,最后的id为commit id)
$ git tag -s v0.2 -m "signed version 0.2 released" id (用私钥签名一个标签)
$ git tag -d v0.1 (删除标签)
$ git push origin v1.0 (将已经创建的标签v1.0推送到远程)
$ git push origin --tags (将已经创建的所有标签推送到远程)
如果标签已经推送到远程,则删除方法:
$ git tag -d v0.9 (先从本地删除标签v0.9)
$ git push origin :refs/tags/v0.9 (从远程删除标签)
注意:在github中对应的远程仓库里,可以查看提交的标签,这些标签被存在releases中,并且可以下载zip文件
github开源项目
在github中点击开源项目中的Fork按钮就可以克隆这个开源项目到自己的github中,然后可以从自己的远程仓库中clone到本地仓库,进行读写操作,然后push到自己的远程仓库,如果想参与到这个远程仓库,可以点击pull request,进行申请
自定义git
$ git config --global color.ui true (让Git显示颜色,突出显示)
忽略特殊文件:
新建一个文件,命名为.gitignore,并且将所有特殊文件名写到这个文件里,将这个文件提交到git,这样每次git status都不会显示未提交这些特殊文件了。
git配置文件
配置别名:
$ git config --global alias.st status (给命令status配置别名st)
配置完成后:$ git st 相当于 $ git status
同样的:
$ git config --global alias.co checkout (checkout ------ co)
$ git config --global alias.ci commit (commit ------- ci)
$ git config --global alias.br branch (branch -------- br)
$ git config --global alias.unstage 'reset HEAD' (reset HEAD -------- unstage)
$ git config --global alias.last 'log -1' (log -1 -------- last 查看最后一次提交信息)
$ git config --globalalias.lg"log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
--global参数是全局参数,这些命令在这台电脑的所有git仓库都可以用
注意:git的配置文件放在了.git/config中,别名在[alias]后面,如果想删除某个别名,可以直接在这里删除
在这里git配置文件分为全局的和当前仓库的配置文件,上面的是每个仓库自己的配置文件位置,全局的配置文件在用户主目录下的一个隐藏文件.gitgonfig中
如果不加--global就是在当前仓库中修改配置文件,只在当前git仓库生效
网友评论