git使用记录

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

解决方法:退出编辑器、浏览器、资源管理器等,然后再切换就可以了。

原文地址:https://www.cnblogs.com/lixuwu/p/9281765.html