tyron's page 不断探索是一件好事,学无止境!

linux下git的基本操作

2020-05-27
David

  • content

1. 创建仓库

$ git init .  #创建仓库

$ git add text.txt   #添加文件
$ git commit -m "write text.txt"   #提交文件到仓库

$ git status
$ git diff   #查看修改文件
$ git log
$ git log --pretty=oneline

2. 回退到之前的版本

$ git reset --hard commit id号  #(commit id号可只取前两位,为了避免相同,可以多取几位)
$ git reset --hard HEAD (查看当前版本)
$ git reset --hard HEAD^^  #(退到上一个版本.HEAD表示当前版本,HEAD^表示上一个版本,同理HEAD^^表示上上个版本。。。。不过这样太麻烦。所以如果要往上回退100个版本,则写成 HEAD~100)
$ git log
$ git log --pretty=oneline
$ git reset --hard HEAD~1 #这里的数字表示你要回退的版本数量)
$ git clean -dxf  #删除当前目录下所有没有track过的文件和文件夹. 不管他是否是.gitignore文件里面指定的文件夹和文件..)

# 签出以前版本的指定文件,并覆盖当前文件
$ git checkout origin/main -- app/cluster_2dwow/src/app_cluster.c
$ git checkout 3da97368a61c7e7b8a46dc661b0bd11bff65e20f -- audio_main.c

# 将当前未提交的文件与以前某个commit id进行比较,并生成差异文件
$ git diff 3da97368a61c7e7b8a46dc661b0bd11bff65e20f --cached >fatfs_on_sdcard_2204191335.diff

3. 回退到之前的版本时,出错后,再恢复

$ git reflog
b7057a9 HEAD@{0}: reset: moving to b7057a9
98abc5a HEAD@{1}: commit: more stuff added to foo
b7057a9 HEAD@{2}: commit (initial): initial commit
$ git reset --hard 98abc5a   #所以,我们要找回我们第二commit,只需要做如下操作:

4. merge分支

$ git checkout master   #首先切换到master分支上
$ git pull origin master #如果是多人开发的话 需要把远程master上的代码pull下来
$ git merge dev         #然后我们把dev分支的代码合并到master上
$ #根据提示找到冲突的文件,解决冲突
$ git status
$ git add <解决冲突后的文件>   #解决冲突后,add, 然后就可以commit了
$ git reflog     #查出要回退到merge前的版本号,按q 退出查询,或者通过Version Control直接查看
$ git reset --hard <commit id>  #回退到merge前的代码

5. 管理修改

$ git diff HEAD -- xxx  #(查看对于某个文件来说,工作区和版本库里面最新版本的区别)
$ git checkout -- file #(恢复修改之前的模样 (–后面有个空格) ,其实是用版本库里的版本替换工作区的版本,一键还原)
$ git reset HEAD 文件名  #(恢复到提交之前)

6. 删除文件

$ rm text2.txt
$ git status
$ git commit -am " "   #(提交删除操作,让文件在版本中删除,必须要用-am提交 )

7. 如何用git命令生成Patch和打Patch

$ git diff --patch > 0001-some-modifications.patch   #从差异生成补丁
$ git apply -R <patch>   #还原补丁
$ git apply ~/patch-set/*.patchpatch #在要应用补丁的文件夹下应用补丁, 不会commit.
$ git am ~/patch-set/*.patchpatch    #在要应用补丁的文件夹下应用补丁, 会commit并添加commit message
$ git am --abort   #如果不想打这一系列patch了,或者废弃上一条am命令
$ git apply --reject <patch_name> #根据git am失败的信息,找到发生冲突的具体patch文件,然后用该命令,强行打这个patch,发生冲突的部分会保存为.rej文件(例如发生冲突的文件是a.txt,那么运行完这个命令后,发生conflict的部分会保存为a.txt.rej),未发生冲突的部分会成功打上patch。根据.rej文件,通过编辑该patch文件的方式解决冲突。
$ git am ~/patch-set/*.patchpatch   #重新打patch

#指定commit id,生成一个差异文件,其中c40dbfc7497e0620621bd7ef36364f41418e7a49为较早的commit id
$ git diff c40dbfc7497e0620621bd7ef36364f41418e7a49 f9d8afe0bac8856bd13d920559735c2c8345ac50 > emmc_boot.diff

#指定commit id,生成一个patch文件,其中3da97368a61c7e7b8a46dc661b0bd11bff65e20f为较早的commit id
$ git diff 3da97368a61c7e7b8a46dc661b0bd11bff65e20f --patch >fatfs_on_sdcard_app.patch

#从某个commit id开始到现在的所有补丁
$ git format-patch c40dbfc7497e0620621bd7ef36364f41418e7a49
0001-cr7-loader-boot-from-emmc-is-ok.patch
0002-cr7-loader-boot-from-emmc-is-OK.patch
0003-Load-cr7-rtos-from-emmc-is-OK.patch

$ git apply --stat 0001-minor-fix.patch #检查patch文件
$ git apply --check 0001-minor-fix.patch #查看是否能应用成功
$ git am -s < 0001-minor-fix.patch #应用patch

# 解决Git apply时warning: 1 line adds whitespace errors.
$ git reset --hard <前一个commit id>
$ git am --reject --whitespace=fix /someone.patch
$ git format-patch -01 重新制作补丁,然后利用             #vimdiff检查一下,是否已修正。

8. git cherry-pick

git cherry-pick 教程

9. git bundle 打包

Git 工具 - 打包 git bundle

10. 永久记住用户名

C盘的C:\Users\Administator目录下生成 .gitconfig配置文件。用文档编辑工具打开该文件

添加:

[user]
 name = titron  //你的用户名
 email = hxxx@163.com  //你的git邮箱账号

[credential]
    helper = store

11. Git:将当前修改的内容提交到新的分支上

有时候在参加一个项目时,执行clone得到master分支, 一开始只是想看看源码或者忘记了自己没有新建分支,结果后面自己根据需求添加了代码【添加后没有执行commit】, 但是此时的修改都在master分支, 提交必然是不可以的,还是要新建分支【所有修改都要在新建分支上进行】,最后在分支执行通过后,才能合并到master分支。 那么,这时候如何力挽狂澜,如何在保存这些修改的前提下,新建分支并提交呢? 原文链接

# 步骤1:在当前的master分支上的修改暂存起来
$ git stash

# 步骤2:暂存修改后,在本地新建分支(new_branch )为新分支的名字
$ git checkout -b new_branch

# 步骤3:将暂存的修改放到新建分支中
$ git stash pop

# 步骤4:使用TortoiseGit进行commit,比如add, modify, delete
# 步骤5:将提交的内容push到远程服务器
git push

# 建立远程分支
$ git push origin testRelease-tzdong
$ git branch -vv
$ git branch --set-upstream-to=origin/testRelease-tzdong testRelease-tzdong

# 删除远程分支
$ git push origin --delete testRelease-tzdong

12. 将多次提交合并成一次提交

git squash 用法

$ git switch main
$ git pull
$ git switch 1-issue-emmc_boot
$ git log

$ git rebase -i main
 # 执行上面的语句后,会进入以下编辑界面
 pick xxx: commit1 add : add xxx
 pick xxx: commit2 fix: update xxxx
 pick xxx: commit3 fix: delete xxx
 pick xxx: commit4 modify : update xxxx
# 进入编辑模式,将除第一行的pick外,其余的pick都改成 squash ,退出编辑模式,保存即可
 pick xxx: commit1 add : add xxx
 squash xxx: commit2 fix: update xxxx
 squash xxx: commit3 fix: delete xxx
 squash xxx: commit4 modify : update xxxx


$ git log --oneline
$ git commit --amend
$ git commit -s --amend

$ git push -f

13. stash/reset –soft/cherry-pick/revert/reflog

Git 不要只会 pull 和 push,试试这 5 条提高效率的命令

stash:存储临时代码。

reset –soft:软回溯,回退 commit 的同时保留修改内容。

cherry-pick:复制 commit。

revert:撤销 commit 的修改内容。

reflog:记录了 commit 的历史操作。

14. git 修改.gitignore后生效

转自git 修改.gitignore后生效

# .gitignore文件内容

# dir 不需要提交的目录
/S4/ICUMX_obj/
/S4/ICUMX_output/


git rm -r --cached .  #清除缓存
git add . #重新trace file
git commit -m "update .gitignore" #提交和注释

git push origin master #可选,如果需要同步到remote上的话

15. linux下git clone出错:ssh: Could not resolve hostname xxxxx.com: Name or service not known

转自Could not resolve host: github.com的解决方案

解决方法:添加相应IP 地址到文件:/etc/hosts

$ git clone git@mmmmm.com:llll.git
Cloning into 'llll'...
ssh: Could not resolve hostname mmmmm.com: Name or service not known
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

$ sudo vim /etc/hosts
# add
xxx.yyy.zzz.xxx mmmmm.com

$ ping mmmmm.com
PING mmmmm.com (xxx.yyy.zzz.xxx) 56(84) bytes of data.
64 bytes from mmmmm.com (xxx.yyy.zzz.xxx): icmp_seq=1 ttl=46 time=108 ms
64 bytes from mmmmm.com (xxx.yyy.zzz.xxx): icmp_seq=1 ttl=46 time=108 ms
64 bytes from mmmmm.com (xxx.yyy.zzz.xxx): icmp_seq=1 ttl=46 time=108 ms

参考:

1.原贴

2.个人最顺手的git工作流程

3.git简易指南

4.git概念及工作流程详解

5.git how to

6. git cheat sheet

Git Cheat Sheet 1 Git Cheat Sheet 2 Git Cheat Sheet 3 Git Cheat Sheet 4


Similar Posts

Comments