若是本地没有代码,首先须要git clone项目到本地,此时clone下来的是master分支,而后再去拉取其余分支,
下面是两种方式html
1.git fetch origin <远程分支名>:<本地分支名>
此时会在本地就有分支了,可是没有跟远端分支创建映射关系,也不会切换到新的分支
git fetch origin <远程分支名> 这种方式只是从远端拉取了分支,可是本地没有新分支
使用 git branch -r 查看, 通常结果为
origin/HEAD -> origin/master
origin/master
origin/<远程分支名>前端
分支管理-多人协做
2.本地新建分支, 把此分支放入其中
git checkout -b <本地分支名> origin/<远程分支名>
这种方式会创建映射关系vue
为何要创建映射关系?
不创建映射关系每次push或者pull都须要指定远端分支node
怎样创建映射关系?
git拉取远程分支并建立本地分支git branch -vv
查看分支的映射关系
切换到分支git branch -u origin/分支名
手动创建当前分支和远端分支的映射关系react
首先切换到要push代码的本地分支上,而后git push origin <远程分支>
在本分支下直接git pull拉取对应远程分支。git
3.git add . git commit -m '完成功能'后 push前 撤销commit,但保留以前的修改github
别人的方法,尝试了没效果:web
git log
找到你想撤销的commit_id
2. git reset --hard commit_id
完成撤销,同时将代码恢复到前一commit_id 对应的版本。面试
完成Commit命令的撤销,可是不对代码修改进行撤销,能够直接经过git commit 从新提交对本地代码的修改。shell
后面搜到的方法,起了做用:git reset --soft HEAD^
今天同事遇到个问题,就是有三个commit,而且已经push到了remote,须要撤销中间的那条commit,保留第一条和第二条commit,使用reset -hard第二条commit hash后,后面的两个commit都消失了,没有达到想要的效果,如今就是恢复回来,那么从远端pull回来就能够了,而后git revert 中间的commit hash,达到了目的,参考了git reset revert 回退回滚取消提交返回上一版本
git使用情景2:commit以后,想撤销commit
feature/creditsCountSetting该分支下有没有merge好的代码因此作了提示,-D就是强制删除分支
如今的开发模式是只能从develop代码到本地,不能push到develop,新建功能或者修复bug都须要新建一个分支,而后push本身的分支到gitlab,而后发起merge request给同事,然他们review并merge到develop分支,那么就存在一个问题,直接merge到develop分支的话有可能会冲突,因此在push本身的分支前必定要拉取develop代码到本身的分支,在本地解决冲突,
也就是 git pull origin develop
由于拉取远端的分支到当前的分支,因此冒号后面的参数就省略了
git pull命令
相似于下面
conventional-changelog 就是生成 Change log 的工具,运行下面的命令便可
Commit message 和 Change log 编写指南
commitlint
一个picker分支基于develop,如今的代码都commit在picker分支,因为react升级到16因此又开了个分支在master分支,因此如今新建分支masterpicker基于master,而后将picker分支的一些commit合并到masterpicker,那么就须要使用cherry-pick命令,若是直接使用git merge 那么就会将全部的develop的代码都合并到了masterpicker分支。
git cherry-pick 使用指南
若是你如今的工做目录(work tree)里搞的一团乱麻, 可是你如今尚未把它们提交; 你能够经过下面的命令, 让工做目录回到上次提交时的状态(last committed state):
$ git reset --hard HEAD
git remote -v
能够查看本地仓库关联了几个远端仓库
git remote add gitee https://gitee.com/balibabu/apollo-linter.git
git push -u gitee develop:master
,不加上develop分支的话,push不了git cherry -v //查看本地已经commit,但未push的版本 git show xxxxx_version_id //查看版本中的具体代码
git add 之后每每切换分支的时候是切换不了的,那么就能够运行git stash暂存代码,git stash list
查看暂存代码记录,而后找到对应版本git stash apply stash@{1}
撤销暂存
新建文件的时候发现git stash 并不起做用,那么怎么办呢?原来暂存分为两种状况:
git stash save -u
orgit stash save --include-untracked
git stash和git stash pop
git stash 暂存当前修改
你可能不知道的关于 Git stash 的技巧
建立本地taggit tag v1.0
将本地tag推送到远端git push origin --tags
获取远端taggit fetch origin tag V1.0
删除本地taggit tag -d V1.0
删除远端taggit push origin :refs/tags/V1.0
查看某个tag详细信息git show v1.0
好比谁在何时打的tag
若是我想在某个tag上build代码,发布到服务器,咱们能够切换到改tag,就拿到了对应的代码
切换到某个taggit checkout v1.0
在从lodash master分支切换到标签4.17.11-es的时候使用git checkout v4.17.11-es
会报错,直接用git checkout 4.17.11-es
就能够切换,很奇怪。比对下发现有些库的tag是没加v前缀的,因此lodash直接git checkout 4.17.11-es
就好了。
同理能够切换代码到历史某次commit id git checkout 170c521
好比怀疑当前代码有问题,历史某次提交多是对的,而后切换到历史某次代码
切换到了历史,怎么切换回最新的代码?
直接git checkout master(分支名)
How to get back to most recent version in Git?
提示我代码没法提交,在本tag上新建个分支就能够正常的开发了git checkout -b <new-branch-name> <tag-name>
git 打标签并推送tag到托管服务器
git切换到某个tag
常常在公司和家里办公,提交代码到一个仓库,可是出现commit username不一样的状况,那么须要在本仓库设置username和email
1.设置本仓库
git config user.name "" git config user.email ""
3.切回master 再新建bill分支 新建logo.txt 执行 git rebase develop
对比两图能够发现,在assassin分支有一条Merge branch 'develop' into assassin的记录而rebase是没这条记录的,也就是rebase提到的若是你想让"mywork"分支历史看起来像没有通过任何合并同样,可是在develop中提交的add file.txt记录仍是在的
固然咱们一般是pull远端的代码到当前的分支
git pull origin develop
git pull origin develop --rebase
简单对比git pull和git pull --rebase的使用
在执行git pull origin develop --rebase
同一个commit产生了两条commitID,不知道是怎么产生的,
使用git rebase合并屡次commit
聊下 git rebase -igit rebase -i
能够将多个commit合并为一个commit
You have not concluded your merge (MERGE_HEAD exists) git拉取失败
因为运行ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
的时候没有加-b 4096
后面运行ssh-add ~/.ssh/id_rsa
就报错了:Could not open a connection to your authentication agent,解决办法,
eval `ssh-agent -s`
再次执行ssh-add ~/.ssh/id_rsa
就行了
运行ssh -T git@gitee.com
返回
Hi assassin! You've successfully authenticated, but Gitee.com does not provide shell access.
代表连接成功,可是我仍是无法经过ssh的方式clone代码,会报错:
git@gitee.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
一头雾水,应该是我多帐号的问题,个人电脑有公司的,有本身的,因此git没法识别,Windows下Git多帐号配置,同一电脑多个ssh-key的管理须要在.ssh目录下新建一个config文件
# 配置gitee.com Host gitee.com HostName gitee.com IdentityFile C:\\Users\\lenovo\\.ssh\\gitee_rsa PreferredAuthentications publickey User username2
这样就能够经过ssh clone代码了
gitee码云使用webhook自动部署前端代码就用到了公钥
对于已经commit但没push的代码的回退每每就须要reset进行操做
reset中三种方式的区别mixed soft hard
git reset 三种用法总结
use "git reset HEAD <file>..." to unstage
一样使用reset
1.对于修改的文件use "git checkout -- <file>..." to discard changes in working directory
2.对于新增的文件rm filename
git放弃修改&放弃增长文件用了git clean -xdf
发现新的的文件从工做区删了,同时也把node_modules目录删了
git reset revert 回退回滚取消提交返回上一版本
Git恢复以前版本的两种方法reset、revert
git 优雅的撤销中间某次提交
开始文件名叫AddUser.js,我在Windows上把文件名改为addUser.js而后push到远端,远端仓库显示仍是AddUser.js,原来是git默认对文件大小写也不区分,而后设置git config core.ignorecase false
,push到远端,远端竟然有两个文件AddUser.js和addUser.js都在,没这让人火大,使出第二招git rm AddUser.js
发现两个都被删了,最后只好再次添加addUser.js,这时候只是把AddUser.js删了,而后push就没问题了
git 默认对文件名大小写不敏感 (不区分文件名大小写)
git remote set-url origin git@github.com:xxx/xxxx.git git remote -v // 查看远程仓库地址
git rm -r --cached . git add . git commit -m 'update .gitignore'
Git中.gitignore文件不起做用的解决以及Git中的忽略规则介绍
git pull
直接拉去远端到本地,若是本地和远端分支没有创建关系,可使用git pull origin master
使用origin制定远端分支git fetch origin master
//代码拉去到了本地,但没有合并到master分支
git merge origin/master
//把刚才从远端拉取到的新代码合并到本地master分支,若是不先fetch,执行 git merge origin/master
是没发把远端新的代码合并到master分支的
本地已存在的分支master,若是直接使用git fetch origin master:master
,会报错 fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository
综上git pull 至关于git fetch + git merge
git fetch & git pull
Git fetch & pull 详解
Git如何回滚一次错误的合并
当你决定去 revert 一个merge commit
Git怎样撤销一次分支的合并Merge
今天的操做是 先merge master分支的代码到发现有冲突 而后解决冲突,push到直接的分支 而后发个pull request而后manager merge了pull request到master,这个时候发现代码本地分支代码还有冲突,其实这个时候能够git reset ,可是若是有人在manager 合并了个人pull request后,提交了新的代码到master,那么reset会形成别人的代码会丢失,因此这个时候只能用revert
master 有reset操做 我bill分支merge了master分支的代码,可是在我merge master分支以前写了一些代码,在merge的时候git会自动将master代码混入到个人分支,这个时候我想保留我本地的代码,可是又惧怕别人在后面有新的代码push到master,若是用reset可能将别人新push的代码去掉,因此用revert操做,
git revert [merge前一条commit id]
会将本身分支写的代丢失掉git revert -m 1 [merge 的那一条commit id]
这个时候会回退到merge以前本身分支的代码对于被tracked文件能够不用git add . 直接这么提交
可是对于新建的文件必须先git add .
而后commit
git 不区分文件名大小写, 没法检测到差别, 致使文件内容的差别push成功
git add text.md
或者git stage text.md
其实,他们两是同义的,因此,惊不惊喜,意不意外?这个问题居然是个陷阱…引入 git stage 的缘由其实比较有趣:是由于要跟 svn add 区分,二者的功能是彻底不同的,svn add 是将某个文件加入版本控制,而 git add 则是把某个文件加入暂存区,由于在 git 出来以前你们用 svn 比较多,因此为了不误导,git 引入了git stage,而后把 git diff --staged 作为 git diff --cached 的相同命令。基于这个缘由,咱们建议使用 git stage 以及 git diff --staged。
来自面试中的那些 Git 问题 - 基础部分
git reset HEAD text.md
, 全部文件/文件夹:git reset HEAD .
git checkout -- text.md
rm filename / rm -rf dir
, 全部文件/文件夹:git clean -xdf
git reset放弃修改&放弃增长文件指出可使用git clean -xdf
,可是执行了发现不但新增的文件被删除了,并且node_modules目录也被删了,因此慎用