1.【重磅推荐】Git管理-廖雪峰
2.【重磅推荐】Git Bash使用详细教程(很详细,包括创建git,远程同步,回退版本,分支管理,解决冲突,隐藏现场修复bug等)
3.Git的使用–如何将本地项目上传到Github
4.git和github新手快速操作流程
工作区(Working Directory):
版本库(Repository):
暂存区(Stage):
为了实现github版本控制,需要创建仓库,有两种方法:
【第一种】(比较麻烦)
git init
初始化本地仓库git status
查看当前repo状态git add .
)git commit -m "first commit"
)(需要输入用户名密码)git remote add origin https://github.com/aaon22357/test.git
)git push -u origin master
)git pull --rebase origin master
,之后再push就好啦。
git pull --rebase
——(是一种冲突解决方式)用在合并代码的时候其作用就是在一个随机创建的分支上处理冲突,避免了直接污染原来的分区,如果有冲突, 解决冲突git add . 不需要commit git rebase --continue git push 到远端
【第二种】(简单,推荐)
第一种做法要在本地和远端分别新建repo,然后remote连接,可能还需要处理冲突,比较麻烦,第二种方法就很简单了!
git add .
)git commit
)git push -u origin master
)以下是【第二种】方法的具体步骤和实现细节:
第一步:在远程gitbub上创建一个repo
第二步:clone远程仓库到本地(有HTTPS和SSH两种clone方式)
git clone https://github.com/aaon22357/test_repo.git
或
https://github.com/aaon22357/test_repo.git
是上面新建好的远程仓库地址
第三步:在本地仓库中修改项目文件
git status:查看本地仓库和暂存区的状态
git diff :查看file文件修改了什么内容
第四步:将最新的项目文件添加到本地暂存区,为commit做准备
git add .
或 git add --all
或git add
查看哪些改动将被提交 git diff --cached
如果不想将某个文件push到远程仓库,使用:git rm --cached 命令
第五步:将暂存区的文件提交到git本地仓库
git commit -m "my commit"
注意:
- my first commit是对本次提交的说明,如果不加-m参数 ,git将调到一个文本编译器(通常是vim)来让你输入提交的描述信息
- 如果没有新增(只有修改或删除),则可以使用git commit -a -m "my commit"将四五步合二为一
- git commit --amend --no-edit 命令可以修改最近一次的提交说明(注释)【参考链接】
第六步:推送到远程github仓库
git push -u origin master
(首次push要加参数 -u)
注意:
- 如果git commit出现如下提示(// 需要输入用户名和密码)
则需要配置一下邮箱和github用户名:
git config --global user.email "[email protected]"
git config --global user.name "aaon22357"
之后再重新git commit即可。- 可以在本机配置,免输账号密码,配置方法见 【参考链接(Windows版)】
- master表示主分支,也可以push到其他分支,将master参数替换成相应的分支名即可
删除本地仓库:rm -rf .git
删除远程仓库:github——打开需要删除的repo——Settings——一直往下拉,有个Delete this repository按钮——正确输入当前repo的名字——点击“I understand the consequences,delete this repository”按钮。
前面提到,clone的时候有两种方式:SSH和HTTPS,两种方式的区别是:【参考】
生成ssh key的步骤:【参考链接,每一步有详细截图】
$ ssh-keygen -t rsa -C "[email protected]"
【查看类命令】
git log
查看git日志(或者git log --oneline 单行简单格式查看日志)git log --graph
命令可以看到分支合并图git log --graph --pretty=oneline --abbrev-commit
(带参数)可以看到分支合并情况git reflog
记录你的每一次命令git status
查看当前所在分支状态git diff
查看不同git remote
查看远程库的信息git remote -v
显示更详细的信息,显示抓取(fetch)和推送(push)的地址。如果没有push权限,就看不到push的地址。git init 初始化仓库,在本地新建仓库会用到
git remote add origin https://github.com/username/project.git 关联一个远程仓库
或者 git remote add origin [email protected]:username/project.git(推荐)需要配置ssh
git add . 将文件加入暂存区
git commit -m "my commit" 将暂存区中文件提交到本地的版本库
git pull 拉取版本库最新数据到本地仓库
git push origin master 将本地仓库中新添加的文件上传到远程分支仓库
git push origin <branch> 将本地branch分支推送到远程仓库
查看所有的分支和当前处于哪个分支:git branch
创建并切换到本地该分支:git checkout -b dev
创建本地仓库分支:git branch 分支名称
切换到本地某分支:git checkout 分支名称
合并指定分支到当前分支:git merge 分支名称
合并本地某分支到当前分支:git merge –no-ff -m “remark” 分支名称
删除本地仓库分支:git branch -d 分支名称
如果要丢弃一个没有被合并过的分支,可以通过git branch -D
强行删除。(-D参数表示强制删除)
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。(来自廖雪峰)
小结(来自廖雪峰)
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
【第一种情形】 丢弃掉工作区的修改:git checkout --
这里又可以分为两种情况:
【第二种情形】 撤回暂存区的修改: git reset HEAD
这种情形描述的是:修改完文件后,已经git add到缓存区了(但是还没有git commit到版本库),此时发现错误,想要把暂存区的修改撤销掉(unstage),重新放回工作区。需要两步:
① git reset HEAD
将暂存区的修改撤销,放回工作区
注意:
git reset HEAD
如果后面什么都不跟的话,就是将暂存区里面的所有修改全部撤销git reset HEAD
,仅对暂存区中的file文件进行撤销
② git checkout --
丢弃工作区的修改,回到最原始版本库的状态
【第三种情形】 撤回git commit: git reset --soft HEAD^
该操作适用于:已经git commit,只差push到远端repo这一步时,想要撤回commit操作的情况。这一步只会撤回commit这一步骤,不会修改代码。
git clean的用法
git clean
命令用来从工作区中删除所有没有tracked过的文件,git clean
经常和git reset --hard
一起结合使用. 记住reset只影响被track过的文件, 所以需要clean来删除没有track过的文件. 结合使用这两个命令能让你的工作目录完全回到一个指定的的状态。
查看哪些文件会被删除:
git clean -n
删除当前目录下所有untracked files:git clean -f
(不会删除.gitignore文件里面的东西)
git rm
操作可以删除本地及版本库中的文件
删除github版本库中的file文件:
git rm
删除文件夹需要加-r参数,git rm -r
git rm --cached
操作删除仓库中的文件,保留本地的文件
如果某个文件不想上传,可以从暂存区及版本库中移除,但是不会删除本地的文件,这个文件之后的修改也不会被跟踪(untracked状态):
git rm --cached
对文件夹或文件路径操作,加-r参数:git rm -r --cached 文件夹或文件路径
回退到上一个版本:git reset --hard HEAD^
往上回退100个版本:git reset --hard HEAD~100
撤销版本回退(回到未来):git reset --hard 1094a(未来版本的commit id)
本地版本回滚后,将本地的repo强制push到远程,即可实现远程版本回滚:git push origin master -f
版本回退总结(来自廖雪峰):
① HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
② 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
③ 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
git tag
(默认标签是打在最新提交的commit上的)git tag
git tag commit_id
git show
git tag -d
(创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除)git push origin
git push origin --tags
git push origin :refs/tags/
【Attention】标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
git stash
命令用于把当前工作现场“储藏”起来,等以后恢复现场后继续工作,在修复bug的时候比较常用。
git stash list
查看隐藏的工作现场
git stash pop
释放隐藏的工作现场
总结:
- 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
- 当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
- 在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick 命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
git add 命令会将文件加入暂存区,
git commit 会将暂存区中文件提交到git本地仓库,
git push 会将本地仓库中新添加的文件上传到远程分支仓库。
git status
命令用于显示工作目录和暂存区的状态。使用此命令能看到那些修改被暂存到了, 哪些没有, 哪些文件没有被Git tracked到。git status
不显示已经commit
到项目历史中去的信息。看项目历史的信息要使用git log
.
原因:本地和远程版本不一致,所以push出错,解决方案有以下几种:
【方法1】强制push:git push -f origin master
这样会使远程修改丢失,一般是不可取的,尤其是多人协作开发的时候。
【方法2】将远程仓库pull下来——手动解决冲突——重新push
git pull origin master
CONFLICT (content): Merge conflict in cnn-visualization.py Automatic merge failed; fix conflicts and then commit the result.
说明有冲突git add
,这里一般会出现master|MERGING
提醒,网上的解决方案是执行git reset --hard head
,其实这种方法是错的,这是撤销合并,不能随便撤销,得根据实际情况,要是一个小白看了,直接照敲进去,可能自己辛辛苦苦写的代码就没了。(一定要注意!)正确做法是:合并好所有冲突,然后git commit,不出意外的话,此时的MERGING
提示已经消失了。git push origin master
【方法3】新建分支——push到新分支——分支合并
若不想merge远程和本地修改,可以先创建新的分支:git branch [name]
然后将本地仓库push到新建的分支中:git push -u origin [name]
在多分支管理时,
多人协作的工作模式通常是这样:
首先,可以试图用git push origin 推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。