Git的工作原理
下图来自 这里
Git命令上传本地已有的repo到github
提醒:Pycharm图形化git操作有问题时请尝试一下命令行操作
- 首先需要在github上新建一个repo,这步不用多说
git remote add origin [远程仓库地址]
例如 git remote add origin https://github.com/jialee**/Myrepo.git
就是把本地repo连接到github上https://github.com/jialee**/Myrepo.git 这个仓库地址,并创建别名为origin ,这个别名是自定义的,通常用origingit push -u origin master
-u ,就是创建 upStream 上传流,如果没有这个上传流就无法将代码推送到 github;同时,这个 upStream 只需且必须要在初次推送代码的时候创建,以后就不用创建了。这一步允许之后会看到比如Branch 'master' set up to track remote branch 'master' from 'origin'.
所以可以发现这里其实就是吧本地的master track到远程repo(origin)的的master分支下。如果远程或者本地有多个分支,不设置upStream的话如何得知要上传哪个部分到那里呢?如果想上传到非默认的master分支下,也是可以指定的,使用git branch --set-upstream-to=origin/new_branch new-branch # (远程)(本地)
Git命令在本地已有的repo基础上创建新分支并上传github
-
创建本地分支并切换到该分支
git checkout -b 分支名
-
提交本地分支到远程仓库
git push origin 本地分支名
-
将新建的本地分支与远程分支关联
git branch --set-upstream-to=origin/远程分支名 本地分支名
-
新建没有父节点的孤儿分支(orphan),不会保留以前的版本记录
git checkout --orphan branch 新分支名
检查:使用 git remote show origin
查看远程和本地branch以及对应情况
使用Git撤销本地修改和回退版本
(1) 对于没有add/commit的文件撤销修改
补充说明:针对没有add或者commit的,使用checkout会直接把工作区的内容撤销更改,立刻肉眼可见把之前的改动清除了。
工作原理:此命令会使用 HEAD (指向你最后一次提交的结果)中的最新内容替换掉你的工作目录中的文件。已添加到暂存区(index/stage)的改动以及新文件都不会受到影响。
(2)对于已经add/commit但是还没push的文件
即为了防止远程服务器因为同步而覆盖此次操作,把当前撤销命令当作一个新的修改记录保存起来,使用:git revert [commit号]
(3)对于已经push到远程服务器的撤回/回退
注意,不加上面的 --force 会因为当前版本低于远程版本而失败,所以要强行覆盖
(4) push本地某新建分支到远程仓库
当地创建的新分支推送到远程新建的分支在推送之前,可能需要在远程新建仓库,并且把当地和远程的仓库联结起来,需要
To make your branch track a remote branch call
例如使用:
git branch --set-upstream-to=origin/new_branch new-branch # (远程)(本地)
(5) git revert 和 git reset的区别
chekout检出 和 断头detached HEAD的处理,以及stash
(1)使用checkout branch切换分支
(2) 断头detached HEAD的处理
git checkout -b 新分支名
这句命令相当于git branch 分支名
和 git checkout 分支名
这两个命令的效果。
detached HEAD的处理具体可以参考:
https://blog.csdn.net/u011240877/article/details/76273335
注意:在checkout回主分支后,merge刚才由detached head创建的分支时,推荐使用pycharm自带的可视化merge功能,解决conflict.
(3)stash 贮匿
注意⚠️:必须是处于git下的文件,未add到git的文件无法使用。
具体stash命令说明见:这篇博客
Merge 以及 Conflict 的解决
首先要保证当前所处的Branck是正确的,否则首先 git checkout master 一下,再选择需要merge的分支,然后进行merge(如在pycharm中选中某一branch,右键然后选中merge into current branch)。
如果出现了冲突conflicts,推荐使用编辑器或者IDE如pycharm自带的diff功能,从冲突中选择我们想选用的版本(accept theirs or yours)。在pycharm中我们可以精细地挑选出不同版本中的代码片段,并且在merge conflicts的同时对源代码做一定对更改,然后apply一下,解决完冲突后,完成merge。
rebase (变基) 和 merge的用法区别
在本地rebase之后,本地的状态会插到远程仓库历史的最后面,效果如下:
然后可以把本地的改动merge之后推送到远程。
rebase 具有简化分支的作用,比如我已经修改了本地并有一个mycommit,但是之前还有一个oldcommit的记录,那么rebase 可以让oldcommit的变成根基(依据)来分析mycommit做了哪些改动。
.gitignore添加忽略git的文件
转自: 链接:https://www.jianshu.com/p/54c0b925fc47
在填写忽略文件的过程中,我发现在IntelliJ IDEA里面,.gitignore中已经标明忽略的文件目录下的文件,当我想git push的时候还会出现在push的目录中,原因是因为在git忽略目录中,新建的文件在git中会有缓存,如果某些文件已经被纳入了版本管理git中,就算是在.gitignore中已经声明了忽略路径也是不起作用的,这时候我们就应该先把本地缓存删除,然后再进行git的push,这样就不会出现忽略的文件了.git清除本地缓存命令如下:
只ignore某个文件,可以直接用下面这一条命令即可
git rm -r --cached filePath # 仅仅将某一个文件(-r: 及其子目录)从缓存区中删除(从而不被git追踪了)。
git commit -m “remove xx” # 提交本次修改(optional)
或者:
git rm -r --cached . # 取消当前目录下所有的git追踪
git add . # 注意:这会默认把项目中的所有文件都追踪了,最好还是手动一个个add进git.
git commit -m ‘update .gitignore’
来解释下几个参数 -r 是删除文件夹及其子目录 –cached 是删除暂存区里的文件而不删除工作区里的文件,第一种是删除某个文件,第二种方法就把所有暂存区里的文件删了,再加一遍,相当于更新了一遍。
git生成生成ssh密钥文件用于github
配置本地Git
转载自:https://zhuanlan.zhihu.com/p/78467553
对于windows系统鼠标右键打开Git Bash:
对于mac和linux之间进入命令行。
输入命令配置用户名和邮箱信息:
git config --global user.name “你的GitHub用户名”
git config --global user.email "你的GitHub注册邮箱"
生成ssh密钥文件:
ssh-keygen -t rsa -C "你的GitHub注册邮箱"
默认不设置密码,直接回车就行。
用文本编辑器打开生成的id_rsa.pub文件,Crtl+A,Ctrl+C复制全部内容。
设置github端
打开GitHub的SSH设置页面:SSH and GPG keys
New SSH key,Title任取,Key粘贴刚刚复制的字符串,Add SSH key