github用法
1 分支操作
> git branch # 查看本地分支
> git branch -r # 查看远程分支
> git branch -a # 查看当前分支和分支列表
> git branch name # 创建新的分支name
> git checkout name # 切换到分支name
> git checkout -b name # 复制当前分支,创建为新分支name,并切换到新分支name
相当于:> git branch name && git checkout name
> git checkout -b name commit_id # 复制commit_id,可以是分支,也可以是某次commit的id,创建新分支name,并切换
> git branch -d name # 删除本地分支name
> git branch -D name # 删除本地分支name(不管它有没有merge)
> git push --delete origin name # 删除远程分支name
2 将某分支设为master
> git checkout name # 切换到name分支
> git branch -d master # 删除本地master分支
> git branch -m name master # 将name分支重命名为master,也可 git checkout -b master name
> git push -f origin master # 将本地master分支强制push到远程分支
3 合并分支
> git checkout master # 切换到master分支
> git merge name # 在master分支下合并name分支
> git push origin master # push到远程分支(无冲突),有冲突先解决冲突
4 log查看
> git log # 查看commit记录
> git reflog # 查看所有分支的所有操作记录
图示所有分支的历史:
-
git gui
然后在菜单栏上 repository-->visual all branch history
或者直接使用命令gitk --all
- git log --graph --all
5 查看某次commit的修改
> git show 78ec756bb5e9d4fd30e8a1c1d8101601a9cf544c
6 删除除master以外的分支
- 删除除master以外的本地分支:
> git branch |grep -v 'master' |xargs git branch -D
- 删除除master以外的远程分支:
> git branch -r | grep -v 'master' | cut -c 10- | xargs git push --delete origin
当删除远程分支出现以下问题:
error: dst refspec 2.8.fb matches more than one.
这是因为分支名和tag名相同了,删除方法:
> git push origin :refs/heads/2.8.fb # 删除远程分支
> git push origin :refs/tags/2.8.fb # 删除标签tag
7 清空工作区和暂存区
- 还没有进行
add .
和commit
操作,即清空工作区的文件:
> git checkout . # 只能清空全部已修改的文件, 但是对于新建的文件和文件夹无法清空
> git clean -fd -n # 确认要删除的文件
> git clean -fd # 删除文件其中-f表示文件 -d表示目录
8 git reset 版本回滚与前进
> git reset --mixed commit_id # 回退版本,且会将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态,
不影响原来本地文件(未提交的也不受影响) ,即回到工作区
> git reset --soft commit_id # 回退版本,不清空暂存区,将已提交的内容恢复到暂存区,
不影响原来本地的文件(未提交的也不受影响),即回到暂存区,git add .状态
> git reset --hard commit_id # 回退版本,清空暂存区,将已提交的内容的版本恢复到本地,
本地的文件也将被恢复的版本替换,即所有修改都没有了,回到commit版本状态
> git reset --mixed HEAD~1 # 回退一个版本
> git reset --mixed HEAD~1 # 回退了版本
> git reflog # 查看分支操作记录,记住前进版本的前6位commit id
> git reset --hard commit_id #也可前进到该分支
回退版本后git push -f 强制push才能完成push成功
9 利用git和vscode查看修改代码的终极教程
记录原始代码的commit id为commit_id1 (可以git log 查看)
当前修改后最新代码的commit id为commit_id2 (回退版本后可git reflog查看)
> git reset --mixed commit_id1 # 回退到原始版本,且代码修改不影响,vscode里面有git扩展可以查看到基于commit_id1版本的commit_id2版本修改,颜色区分,
> 进行代码修改,方便查看修改部分,写代码
> git reset --mixed commit_id2 # 回退到新版本,且本地修改不变,忘记commit_id2可git reflog查看
> git add . && git commit # 提交代码
> 可循环进行
10 删除文件
当我们需要删除暂存区或分支上的文件, 同时工作区也不需要这个文件了, 可以使用:
> git rm file_path
> git commit -m 'delete somefile'
> git push
当我们需要删除暂存区或分支上的文件, 但本地又需要使用, 只是不希望这个文件被版本控制, 可以使用:
> git rm --cached file_path
> git commit -m 'delete remote somefile'
> git push
注:删除文件夹可加-r
11 迁移git仓库
适用情况:用别人的项目当作基础,然后开发自己的项目,如果使用fork该项目,那么就算重命名别的项目名称,github上搜索不到,并且在fork项目下的提交不会增加自己的提交贡献(这点非常不爽,滑稽)。
所以可以新建一个仓库,然后将某个项目搬到新仓库,并且保存log和commit。
第一种方法:改remote,在本地已有仓库更方便
#新建仓库 project_new
> git clone http://xxx/project_old.git #克隆旧仓库
> git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
#在本地分支创建所有远程分支
> git remote set-url origin http://xxx/project_new.git #改remote的地址
> git push --all #push所有分支的内容
##如果只要一个master分支,可以只git push -u
第二种方法:直接镜像迁移,只操作远程分支,和本地基本没关系
#新建仓库 project_new
> git clone --bare http://xxx/project_old.git #从地址克隆裸版本仓库
> cd project_old.git
> git push --mirror http://xxx/project_new.git #以镜像推送的方式上传到新仓库
12 clone仓库,忽略提交历史方法
> git clone -b master --depth 1 http://xxx/project_new.git res_dir
# -b 指定分支或commit_id
# --depth 只保留commit的记录的深度,就是git log下的深度,可以大大降低某些大项目的大小,
# res_dir 保存到目标文件夹,以该目录作为项目的目录
> git fetch --unshallow # 如果使用了--depth,记得加这个,避免git push推送时出现(shallow update not allowed)的错误,这个命令会重新拉取全部仓库代码
> git checkout --orphan new_branch
# --orphan 基于当前分支创建一个没有任何提交历史的分支,
# 可用于重新提交到master,或者初始化项目,去除提交历史
# 重新提交master:git add . && git commit -m "" && git branch -D master (删除原先分支) && git branch -m master(修改当前分支名称)&& git push -f origin master
网友评论