1 安装
直接在官网下载最新版本
https://tortoisegit.org/download/
并可以下载相应的汉化包。
tortoiseGit 在安装的时候选择默认的安装目录,汉化的时候就不会出现setting菜单汉化,但是右键无汉化的情况。
如果在卸载过程中出现其它问题,可以考虑重启电脑解决
一路next 安装完成
git bash —— 自报家门 设置电脑的邮箱和用户名
$ git config --global user.name "lxw-PC"
$ git config --global user.email "wanmeishijie4113@163.com"
$ git config user.name
$ git config user.email
使用
git pull 获取并合并其他的仓库,或者本地的其他分支。
git pull 与 git push操作的目的相同,但是操作的目标相反。命令格式如下:
git pull <远程主机> <远程分支>:<本地分支>
例如:
git pull origin master:my_test
上面的命令是将origin厂库的master分支拉取并合并到本地的my_test分支上。
如果省略本地分支,则将自动合并到当前所在分支上。如下:
git pull origin master
基于库上代码,创建新的分支
git checkout -b develop_td_utfp_0821 origin/develop_td_utfp_0821
回退到上一次commit的状态
git reset --hard HEAD^
=========================
版本库又名仓库 repository
创建git版本库
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
git可以多次add
git可以一次commit很多文件
git diff 查看文件的不同
比较工作区的内容和add的或者commit中内容的不同
git log
用来查看提交的历史记录
精简查看
git log --pretty=oneline
回退到上一个版本
$ git reset --hard HEAD^
HEAD is now at e475afc add distributed
上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
git reflog
查看每次提交的commit id 然后恢复
git reset --heard 66f23a
工作区 working directory
工程目录的文件夹
版本库 Repository
工作区隐藏的.git目录
git管理的是修改,而非文件。
撤销修改
git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。
把工作区的内容回退到最近一次git commit或者git add的状态。
git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区:
删除文件
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
推送到远程仓库
ssh-keygen -t rsa -C "wanmeishijie4113@163.com"
git remote add origin https://github.com/cs408/learngit.git
git push -u origin master
期间要输入git的用户名和密码
git push origin master
从远程仓库clone
在github上创建远程仓库并初始化
git clone https://github.com/cs408/gitskills.git
创建与合并分支
阅读: 999248
在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
git-br-initial
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:
下面开始实战。
首先,我们创建dev分支,然后切换到dev分支:
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
然后,用git branch命令查看当前分支:
$ git branch
* dev
master
git branch命令会列出所有分支,当前分支前面会标一个*号。
然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:
Creating a new branch is quick.
然后提交:
$ git add readme.txt
$ git commit -m "branch test"
[dev b17d20e] branch test
1 file changed, 1 insertion(+)
现在,dev分支的工作完成,我们就可以切换回master分支:
$ git checkout master
Switched to branch 'master'
切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:
git-br-on-master
现在,我们把dev分支的工作成果合并到master分支上:
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。
注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。
合并完成后,就可以放心地删除dev分支了:
$ git branch -d dev
Deleted branch dev (was b17d20e).
删除后,查看branch,就只剩下master分支了:
$ git branch
* master
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
Git鼓励大量使用分支:
查看分支:git branch
先切换到需要到的分支,然后再该分支上继续创建分支。
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
ps:切换不同的分支,当前目录会显示不同的内容
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph命令可以看到分支合并图。
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
git merge --no-ff -m "merge with no-ff" dev
复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。
小结
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
使用标签
命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
命令git tag可以查看所有标签。
命令git push origin <tagname>可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签;
命令git tag -d <tagname>可以删除一个本地标签;
命令git push origin :refs/tags/<tagname>可以删除一个远程标签
忽略某些文件时,需要编写.gitignore;
.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!
#####
1. git clone xxx.git
从远程库中获取xxx库
2. git pull
更新本地git库,并自动合并本地代码(不可控)。
例如:
git pull origin master
则是将远程的master库更新合并到当前的本地库
3. git fetch
更新本地git库,不执行合并。推荐使用本命令进行更新。
例如:
git fetch -f origin master
则是将远程的master强制覆盖到本地库(如果本地库有修改,则会丢失这些修改)。
利用本命令来更新本地git库比使用git pull命令更安全可靠。下面是具体的使用示例:
git fetch origin master:tmp
git diff tmp
git merge
这样,更新本地库代码时,合并操作将是可控的。
4. git push
将本地库的修改推送到远程库上。
例如:
git push origin XXX
则是将本地库的XXX分支推送到远程库的XXX分支。
5. git checkout
将本地库切换到指定分支。
例如:
git checkout XXX
则是切换到XXX分支
此外,
git checkout -B XXX
则是创建一个新的分支XXX,并切换到这个分支。
6. git branch
查看本地库中存在多少个分支,并显示当前所处分支。
此外,
git branch -D XXX
则是删除XXX分支。
7. git log
查看当前分支的历史修改记录。
上面这几条命令是属于比较简单并且常用的命令,只要用几次就可以掌握。至于像其它的一些复杂些的命令,例如git add,则推荐使用图形界面软件(例如uDeck, TortoiseGit)进行处理,因为使用这些软件可以更方便地看出我们作了哪些修改,并选择提交哪些修改作为一个commit。
特性交付时候使用技巧
针对交付代码较多,从维护方便考虑,可以用分支来做区分
在合入朱波杰的代码库后,基于当前分支拉取新的分支,
第二次合入时候,只用把新修改的合入即可。
也可以知道前后两次修改了什么
问题记录
本地向远端推送代码时候报错
出现这个问题的原因是,本地和远端的信息未同步,可能是因为本地创建分支的原因
解决方法:
git lfs fetch --all
一个本地分支commit了四次,然后push到orign(fork的仓库)上面,现在想把origin上面的commit改为1次:
在本地使用重reset到两次commit之前的版本,重置类型选择混合,那么之前所作的修改还会保留。
重置之后再本地commit,然后push到远端,勾选强制覆盖选项,就会看到远端的那个分支只有一次commit
windows本地进行编辑修改,linux服务器进行构建编译。
在本地使用小乌龟切新的分支,代码修改完成后push到origin。
在linux服务器上执行
//更新库上库到本地 git remote update //切换到windows分支 git checkout windows分支
这样就可以实现windows修改 提交和pr。在linux实现同样代码的构建编译
Unable to create '../.git/index.lock': File exists.
常因为多个git操作,发生git锁住的情况
git命令行进入到项目文件夹
执行 rm -f ./.git/index.lock
最好查看一下这个index.lock文件是否存在
The following untracked working tree files would be overwritten by checkout
删除未跟踪的文件
git clean -d -fx
可能很多人都不明白-d,-fx到底是啥意思,其实git clean -d -fx表示:删除 一些 没有 git add 的 文件;
git clean 参数
-n 显示将要删除的文件和目录;
-x -----删除忽略文件已经对git来说不识别的文件
-d -----删除未被添加到git的路径中的文件
-f -----强制运行
git clean -n
git clean -df
git clean -f
https://blog.csdn.net/lisulong1/article/details/78910727
git cherry-pick xxx
出现大量冲突,想回退,按如下操作解决
git reset HEAD^ git clean -d -fx git checkout . git status
Permission denied
$ git cherry-pick a6263e80 error: cannot stat 'code/source/driver/dpl/control/pts/fnpr_switch_central': Permission denied error: cannot stat 'code/source/driver/dpl/control/pts/fnpr_switch_central': Permission denied error: cannot stat 'code/source/driver/dpl/control/pts/fnpr_switch_central': Permission denied error: cannot stat 'code/source/driver/dpl/control/pts/fnpr_switch_central': Permission denied error: cannot stat 'code/source/driver/dpl/control/pts/fnpr_switch_central': Permission denied error: cannot stat 'code/source/driver/dpl/control/pts/fnpr_switch_central': Permission denied error: cannot stat 'code/source/driver/dpl/control/pts/fnpr_switch_central': Permission denied fatal: cherry-pick failed
解决方法:退出编辑器、浏览器、资源管理器等,然后再切换就可以了。