Git和GitHub
git简单命令
git config --global user.email "自己邮箱"
git config --global user.name "自己名字"
git init 初始化,创建版本仓库
不要使用windows的记事本来记录信息,最好用notepad++,设置默认编码为UTF-8
git add 文件名 单个文件管理
git add . 全部管理起来
git commit -m ‘创建第一个版本说明’
git diff 查看修改内容
git status 查看当前文件夹状态
git log 查看提交历史,方便回退到之前版本
git log --pretty=oneline 一行显示日志
git reflog 查看命令历史,方便回滚到未来版本
git reset --hard 版本号 回滚到上一个版本
git checkout -- file 把文件在工作区的修改全部撤销 (就是让这个文件回到最近一次git commit或git add时的状态。)
1.一种是file自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
2.一种是file已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
当我们在本地工作区删除了一个文件时候,工作区和版本库就不一致了,git status会显示文件被删除,如果的确并确定及肯定是无用要删除的文件,就执行git rm file 删除和git commit 提交
如果是误删 git checkout --file
本地Git推到GitHub
本地Git库和GitHub是通过ssh加密进行传输
第一步:确定本地是否有ssh目录,以自己windows笔记本为例,在C:\Users\orion\.ssh可以找到,然后确认里边是否有id_rsa(私钥:不可泄露给别人)和id_rsa.pub(公钥:可以告诉别人)这两个文件
如果没有.ssh或者那两个文件 打开Git Bash创建ssh,命令如下:ssh-keygen -t rsa -C "youremail@example.com",直接一路回车用默认即可
第二步:登陆GitHub,点击 Settings===》SSH and GPG keys===》New SSH key 填写标题并将id_rsa.pub内容填入下面===》Add SSH key 就完成秘钥添加
将本地Git和GitHub做远程同步
登陆GitHub右上角New repository填写Respository name 然后Create respository,完成创建一个Git库
现在将本地的Git库推送到GitHub
git remote add origin git@github.com:DemoRun/BBS.git
DemoRun为GitHub的账户名 BBS为本地库
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
下一步,将本地库的所有内容推送到远程库上:
git push -u origin master
推送成功后,可以在GitHub页面中看到远程库的内容已经和本地一模一样了
从现在起,只要本地做了提交,就可以通过命令:git push origin master 把本地的master分支的最新修改推送到GitHub。
克隆一个远程库到本地
首先创建一个远程库
将远程服务器克隆到本地
git clone git@github.com:DemoRun/Test.git DemoRun为GitHub账户名/Test.git为远程项目名
分支
创建一个dev分支,然后切换到dev分支
$ git checkout -b dev Switched to a new branch 'dev'
-b 相当于创建并切换到分支,相当于以下两条命令
$ git branch dev $ git checkout dev Switched to branch 'dev'
查看分支(当前分支会有*号)
git branch * dev master
在分支里边添加一个文件并提交,然后再切换到master分支(这时候在master下会看不到添加的文件),我们需要合并分支
$ git merge dev Updating d8bf1a4..de568bc Fast-forward new5.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 new5.txt
这时候就能够在master分支上看到在dev新添加的文件了,合并完成后,就可以放心删除dev分支了(强制删除用-D)
$ git branch -d dev Deleted branch dev (was de568bc).
工作原理如图:
解决合并分支冲突
首先可以创建个新分支,并且在里边做文本并提交。然后切换到master上在文本上再次做修改,再次提交,这时候就会出现冲突问题。
$ git add new.txt $ git commit -m "& simple" [master 5dc6824] & simple 1 file changed, 1 insertion(+), 1 deletion(-)
这是此时的状态,两次修改无法合并统一,git status可以看到文件存在冲突
查看修改的文件new.txt 在里边Git通过<<<<<,======,>>>>>>会标记不同分支内容,将修改的部分手动修改给他进行统一,再次提交解决冲突问题。
这是修复后的分支状态,查看日志也可以看到合并情况,最后删除分支。
普通模式进行合并
以上都是用Fast forward进行的合并,看不出曾经做过合并,这时候使用普通合并能够看到合并后的历史。使用--no-ff参数实现普通合并
git merge --no-ff -m "merge with no-ff" dev
BUG分支处理
当出现bug需要处理,但是当前dev工作还没有提交时候,使用stash功能,将当前工作现场“存储”,以后恢复后再继续工作
$ git stash Saved working directory and index state WIP on dev: eb083b3 1
假定要从master分支上修改,就从master上创建分支:
$ git checkout master Switched to branch 'master' Your branch is ahead of 'origin/master' by 12 commits. (use "git push" to publish your local commits) orion@DESKTOP-UCUQ02V MINGW64 /d/GitHub/Test (master) $ git checkout -b issue-01 Switched to a new branch 'issue-01'
修复完bug进行提交操作
orion@DESKTOP-UCUQ02V MINGW64 /d/GitHub/Test (issue-01) $ git add . orion@DESKTOP-UCUQ02V MINGW64 /d/GitHub/Test (issue-01) $ git commit -m 'fix bug01' [issue-01 d151370] fix bug01 1 file changed, 1 insertion(+), 1 deletion(-)
修复完成后切换到master目录下,进行合并,最后删除issue-01
orion@DESKTOP-UCUQ02V MINGW64 /d/GitHub/Test (master) $ git merge --no-ff -m 'merge fix bug 01' issue-01 Merge made by the 'recursive' strategy. new5.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
$ git branch -d issue-01
这时候会到dev继续未完成工作
使用git stash list查看
$ git stash list stash@{0}: WIP on dev: f52c633 add merge
恢复工作区:
1.使用git stash apply stash@{0}恢复,然后使用git stash pop来删除list列表内容
2.使用git stash pop,恢复的同时把stash内容一并删除
多人协作
查看远程库信息:git remote,默认是origin
$ git remote origin
使用git remote -v显示详细信息:一般可以看到抓取和推送的origin地址,除非没有权限,看不到push地址
$ git remote -v origin git@github.com:DemoRun/Test.git (fetch) origin git@github.com:DemoRun/Test.git (push)
推送分支,将本地分支推送到远程库,要指定本地分支
$ git push origin master
当多人一起开发时候会推送不同版本的分支,这时候如果你也推送分支,会提示错误,有冲突,这时候需要先git pull把最新提交的从origin/dev抓取下来,在进行本地合并,解决冲突在推送:
$ git pull There is no tracking information for the current branch. Please specify which branch you want to merge with. See git-pull(1) for details. git pull <remote> <branch> If you wish to set tracking information for this branch you can do so with: git branch --set-upstream-to=origin/<branch> dev
如果提示以上 no tracking information 则证明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
如果合并有冲突,解决冲突,并在本地提交
解决掉冲突或者没有冲突后再git push origin <branch-name>推送就能成功
$ git push origin dev Counting objects: 6, done. Delta compression using up to 4 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (6/6), 621 bytes | 621.00 KiB/s, done. Total 6 (delta 0), reused 0 (delta 0) To github.com:michaelliao/learngit.git 7a5e5dd..57c53ab dev -> dev
使用rebase将提交历史分支线整理为一条直线
git rebase git log
git log --pretty=oneline --abbrev-commit
标签管理
可以给分支打上标签,方便查看(标签与commit是挂钩的)
在Git中找到需要打标签的分支,使用git tag <name>打上标签,还可以创建带描述的标签用 -a 指定标签名,-m 指定描述信息,同时也可以对之前历史版本做标签,在后边加上版本号
$ git tag v1.0 $ git tag -a v0.1 -m "version 0.1 released" 1094adb
查看标签和查看标签描述
$ git tag $ git show <tagname> tagname为自己之前定的版本号 如v1.0
推送标签到远程
$ git push origin <tagname> tagname为版本号 $ git push origin --tags 一次性推送所有标签到远程
删除标签
$ git tag -d v0.1 删除本地标签 $ git push origin :refs/tags/v0.9 删除远程标签(先删除本地标签)