本篇为工作中 git 使用过程中的一些操作记载,不定期更新。
目录
7、git 恢复reset删除(本地分支的commit被reset了看不到了怎么恢复)
1、git 推本地代码到远程
git clone http://github.com/jquery/jquery.git 克隆远程仓库到本地
git status //(最常用的命令) 查看当前代码库当前分支的变化,包括 没有add的文件和已提交等待push的commit
如果本地代码都push到远程了会返回类似 nothing to commit, working tree clean
git add . //将当前目录下的所有修改添加到本地暂存区。
git commit -m '这是提交的注释,gitlab会看到描述' //添加本地暂存区的数据到本地的分支(HEAD)
git pull origin master //push前先拉gitlab的代码是个好习惯、(此时可能会有冲突)
如果有冲突(别人更新了远程代码库) 就合并一下,这块建议在idea这种自带git工具或者 source Tree 这种工具中玩,比较方便。 然后可以选择 merge/rebase
merge会将分支树变丑,默认是merge 然后再commit 就可以push了。
git push origin master //将本地master的commit提交到远程。
2、git 放弃修改/commit/撤销远程提交记录
git checkout . //放弃本地 add操作之前的修改。
git checkout -- a/b.txt //放弃本地指定文件的修改(未add的文件)。 如果是新创建的文件直接手动删除就好了。
git reset HEAD a.txt //放弃 add 但没commit的修改。(已经add的文件)
git reset --hard HEAD ^ //放弃本次commit、 HEAD ^ 可以根据commitID进行修改。 git log查看、
git reset --hard commitID //回滚当前分支版本的修改到某一个提交。 这个commitID 是你要回滚到的commitID
git push -f origin master //回滚完需强制提交。(gitlab不会被污染) origin master 根据分支不同需要切换。
3、git pull/push/fetch
git push <远程主机名> <本地分支名>:<远程分支名>
将本地的master分支推送到origin主机的master分支。如果master不存在,则会被新建
git push origin --delete dev //删dev分支本地与远程的联系,并在远程删除dev分支。 origin 是远程主机名。默认origin
git push origin :foo //空 source 会删除远程仓库中的foo分支。
git push -u origin master //将本地的master分支推送到origin主机, -u指定origin为默认主机,后面就可以不加任何参数使用git push
git push origin //将当前分支推送到远程。
git push origin master^:newBranch //检索master^ 推送到远程的newBranch 推送的分支不存在创建新分支
git fetch origin foo //抓远程的foo分支到本地的 origin/foo分支 所取回的更新,在本地主机上要用”远程主机名/分支名”的形式读取
也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支. git merge origin/master 就合并fetch的信息到当前分支了。
git fetch origin foo^:bar //抓远程foo提前一个commit的记录到本地 本地bar分支不存在就本地创建
如果 git fetch 没有参数,它会下载所有的提交记录到各个远程分支!!!
git fetch origin :bar //如果fetch空 source 会在本地创建一个分支 bar
git pull origin foo //相当于git fetch origin foo; git merge origin/foo
git pull origin master //会将远程的master抓下来并与当前分支合并,无论我们当前检出的位置是哪。
git pull origin master:foo //抓取master,将foo指向master的commit 合并当前位置与抓下来的master
4、git关联本地与远程分支
1.本地已有分支,建立关联关系
git branch --set-upstream-to origin/feature/1.0.0base 关联本地当前分支(master) 与远程 feature/1.0.0base 分支
2.本地尚未有分支,新建分支并创建关联关系(常用)
git checkout -b feature/1.0.0base origin/feature/1.0.0base
新建本地 feature/1.0.0base 分支关联到远程的指定分支
5、git branch 查看(删除)分支
git branch -a //查看远程的所有分支
git branch -v //查看本地分支与远程分支的对应关系。
git branch -vv //查看本地与远程分支的对应关系。
git branch -r //列出远程分支。
git branch -d //删除本地分支。
如果想删除本地dev分支并且删除远程库dev分支,并删除他俩之间的联系。
git branch -d dev //删本地dev分支
git push origin --delete dev //删dev分支本地与远程的联系,并在远程删除dev分支。
6、git tag
git tag 是以当前的HEAD的 commit记录来打tag的。
git tag //查看tag
git tag v1.1.0 //给当前分支打tag
git tag v1.0.0 039bf8b //给指定commit打tag
git tag --delete v1.0.0 //删除本地tag
git push -d origin v1.0.0 //删除远程tag ==> git push --delete origin v1.0.0
git push origin v1.0.0 //推送本地指定tag
git push --tags //推送所有本地tag
7、git 恢复reset删除(本地分支的commit被reset了看不到了怎么恢复)
git reflog 查看被reset的commit
然后再执行 git reset --hard HEAD@{XXX} 来恢复。
8、git config
git config --system --list ----查看系统的配置。
git config --global --list ----查看全局的配置。
git config --local --list ----查看当前仓库的配置。
底层配置会覆盖顶层配置
举个栗子。
git config --global user.name "myname"
git config --global user.email "test@gmail.com"
9、关于git不清洗缓冲区不能切分支的问题。
有如下几种处理方式:
1. git add并且git commit,再git checkout,切换到当前分支
2. git add但不git commit,可以git stash,然后git checkout到新分支,做修改,然后git checkout回到之前的分支之后git stash apply,再git commit,提交到之前的分支
git stash apply stash@{2} 到应用指定的stash存储桶、
3. git add但不git commit,也不git stash,直接git checkout到新分支,做修改,然后再git commit的话,记录就在切换后的分支下面。
其背后的原因:一个本地的git repo只有一个工作区和暂存区,但是有多个分支的提交区,而我们的checkout只是将HEAD指针从一个分支切换到另一个分支。
10、git merge(合并分支&&commit)
合并其他分支的代码到当前分支。
git merge hotfix 合并 hotfix分支的代码到 当前的分支。 (合并的是分支)
当我们只需要合并一个commit时,就只需 git checkpick 1heohdqi2ud 将指定的commitID 合并到当前分支、
还有一种是使用rebase rebase和merge的区别就是 rebase更好看一些。不会让git tree 乱七八糟的。
git rebase --onto master 76cada^
git rebase side1 side2 将side2 合并到side1下面。rebase commit side只是一个标志HEAD。可以写成分支名称。
11、git remote
git remote update origin --prune # 更新远程主机origin 整理分支
git remote -v # 列出详细信息,包括库和URL地址。
12、git submodule
git submodule add https://www.gitlabxxx.com/zhangyong.git ext/zhangyong
上面这个命令是在父.git 下执行的。将子模块添加到了 父目录下/ext/zhangyong处。
在提交父项目到gitlab时不会将ext/zhangyong中的所有文件都提上去,而是在zhangyong这个文件中记录https://www.gitlabxxx.com/zhangyong.git 的commitID
//虽然是工作目录中的一个子目录,但 Git 还是会将它视作一个子模块。当你不在那个目录中时,Git 并不会跟踪它的内容, 而是将它看作该仓库中的一个特殊提交。
git diff --cached --submodule // 查看子模块的信息。
克隆项目到本地
git clone --recursive http://gitlabxxx.com/zhangyong/MainProject
上述命令相当于先 git clone http://gitlabxxx.com/zhangyong/MainProject 在到对应的子模块中顺序执行git submodule init git submodule update 将子模块的代码拉下来、
更新子模块
1.父目录下运行 git submodule foreach git pull
2.子模块中执行 git pull
删除submodule
git rm --cached sql_source/s1 //变更父.git的index文件
rm -rf sql_source/s1 //删除子模块文件(夹)
vim .gitmodules //变更module配置文件 删除对应的子模块信息
vim .git/config //变更配置信息
[submodule "sql_source/s1"]
path = sql_source/s1
url = git@gitlabxxx.com:zhangyong.git
13、本地项目提交github的repository
git init
git add .
git commit -m ' msg'
git pull origin master --allow-unrelated-histories
处理冲突 commit
git push origin master
14、合并某个commit提交记录到当前分支
git checkout master
git cherry-pick dad12dawdwa // 后面是commitID