Valuebai / awesome-python-io

Python十分钟入门指南/技术图谱,持续更新收集整理中,期待你的参与
MIT License
8 stars 1 forks source link

【Git】学习git指南 #4

Open Valuebai opened 5 years ago

Valuebai commented 5 years ago
  1. git - 简明指南 http://rogerdudler.github.io/git-guide/index.zh.html

  2. Git的奇技淫巧 https://github.com/521xueweihan/git-tips

【git设置】 1、 每个项目需要在单独在.git里面的config文件添加下面的代码,设置不同的提交人信息,避免多个账户混乱 [user] name = luhuibo email = luhuibo306@foxmail.com

Valuebai commented 4 years ago

【问题场景】本地head-代码不是master,push报错,需要将当前版本设置为master


确保当前head分支(版本)是最新的(且合并master),能够被推倒origin/master没问题的

  1. git checkout master 用“更好的分支”覆盖“master”

  2. git reset --hard better_branch(或者版本号) 强制将推送到远程存储库:

  3. git push -f origin master or git push origin master --force 再推送到远程仓库  

Valuebai commented 4 years ago

【问题场景】git提交时不用输入用户名密码的方法 https://jingyan.baidu.com/article/4b07be3cf27d8148b280f36a.html

【问题场景】git切换分支导致代码丢失找回 使用git reflog查看日志

【问题场景】git branch -vv命令方便部署后确认当前的分支信息

GIT如何创建分支,并且将分支推送到GITHUB上

1. 首先在本地创建分支    git   branch  分支名称
如:git   branch  dev-0.0.1 在本地创建一个名称为dev-0.0.1的分支
2. 将分支推送到远程GITHUB上   git   push origin  本地分支名称:远程分支名称  
如:git   push  orgin    dev-0.0.1:dev-0.0.1

【问题场景】使用Git删除GitHub的提交历史记录

【问题场景】使用Git为每个项目配置独立的用户名和邮箱 执行ls -all命令,显示所有文件,即可看到.git的隐藏文件夹。通过cd .git 进入该目录,发现该目录下有个config文件,采用 open config 命令打开,添加如下配置:

[user]
    name = XXX(自己的名称英文)
    email = XXXX(邮箱)

保存,command+s 即可。这时候就为该项目配置了独立的用户名和邮箱,这时提交代码时,提交日志上显示的就是设置的名称,当然github这种会根据设置的邮箱来设置对应的用户名。 当然也可以通过命令行的方式(即要去掉–global参数)去设置单独的git配置,只需要在 .git 文件夹下。 例如执行如下命令:

git  config  user.name  "xxxxx"

【问题场景】github/git 修改已提交记录的作者和邮箱 详情见:https://blog.csdn.net/rain_zhao_0102/article/details/104902117

Valuebai commented 4 years ago

Git 工作流

git checkout master    # 切到master
git pull origin master     # 拉取更新
git checkout -b newbranch    # 新建分之,名称最好起个有意义的,比如jira号等

# 开发中。。。
git fetch origin master    # fetch master
git rebase origin/master    #

# 开发完成等待合并到master,推荐使用 rebase 保持线性的提交历史,但是记住不要在公众分之搞,如果有无意义的提交也可以用 rebase -i 压缩提交
git rebase -i origin/master
git checkout master
git merge newbranch
git push origin master

# 压缩提交
git rebase -i HEAD~~    # 最近两次提交
Valuebai commented 4 years ago

Git 别人的经验

 # .gitconfig配置用如下配置可以使用pycharm的diff和merge工具(已经安装pycharm)
 [diff]
     tool = pycharm
 [difftool "pycharm"]
     cmd = /usr/local/bin/charm diff "$LOCAL" "$REMOTE" && echo "Press enter to continue..." && read
 [merge]
     tool = pycharm
     keepBackup = false
 [mergetool "pycharm"]
     cmd = /usr/local/bin/charm merge "$LOCAL" "$REMOTE" "$BASE" "$MERGED"

 # https://stackoverflow.com/questions/34549040/git-not-displaying-unicode-file-names
 # git 显示中文文件名,如果你的文件名有中文会好看很多
 git config --global core.quotePath false

 # 用来review:
 git log --since=1.days --committer=PegasusWang --author=PegasusWang
 git diff commit1 commit2

 # 冲突以后使用远端的版本: NOTE:注意在 git merge 和 git rebase 中 ours/theirs 含义相反
 # rebase 场景下,theirs 实际表示的是当前分之
 # merge 场景下相反,theirs 表示的确是远端分之
 # https://stackoverflow.com/questions/16825849/choose-git-merge-strategy-for-specific-files-ours-mine-theirs
 git checkout --theirs templates/efmp/campaign.mako

 # 防止http协议每次都要输入密码:
 git config --global credential.helper 'cache --timeout=36000000'      #秒数

 # 暂存和恢复,当我们需要切分支又暂时不想 git add,可以先把目前的修改咱存起来
 git stash
 git stash apply
 git stash apply stash@{1}
 git stash pop # 重新应用储藏并且从堆栈中移走
 # 显示 git stash 内容 https://stackoverflow.com/questions/7677736/git-diff-against-a-stash
 git stash show -p  # see the most recent stash
 git stash show -p stash@{1}

 # 删除远程分之
 git push origin --delete {the_remote_branch}

 # 手残 add 完以后输入错了 commit 信息
 git commit --amend
 # 类似的还可以修改上一个提交者的名字 https://stackoverflow.com/questions/750172/how-to-change-the-author-and-committer-name-and-e-mail-of-multiple-commits-in-gi
 git config --global user.name "you name"
 git config --global user.email you@domain.com
 git commit --amend --reset-author

 # 撤销 add (暂存),此时还没有 commit。比如 add 了不该 add 的文件
 git reset -- file
 git reset # 撤销所有的 add

 # 撤销修改
 git checkout -- file

 # 手残pull错了分支就(pull是先fetch然后merge)。或者 revert 一个失误的 merge
 git reset --hard HEAD~
 # 如果 pull 产生了 冲突,可以撤销。
 git merge --abort
 # git rebase 同样可以
 git rebase --abort

 # How to revert Git repository to a previous commit?, https://stackoverflow.com/questions/4114095/how-to-revert-git-repository-to-a-previous-commit
 git reset --hard 0d1d7fc32

 # 手残直接在master分之改了并且add了
 git reset --soft HEAD^
 git branch new_branch # 切到一个新分支去 commit
 git checkout new_branch
 git commit -a -m "..."
 # 或者
 git reset --soft HEAD^
 git stash
 git checkout new_branch
 git stash pop

 # 如果改了master但是没有add比较简单,三步走
 git stash
 git checkout -b new_branch
 git stash pop

 # rename branch
 git branch -m <oldname> <newname>
 git branch -m <newname> # rename the current branch

 # 指定文件类型diff
 git diff master -- '*.c' '*.h'
 # 带有上下文的diff
 git diff master --no-prefix -U999

 # undo add
 git reset <file>
 git reset    # undo all

 # 查看add后的diff
 git diff --staged

 # http://weizhifeng.net/git-rebase.html
 # rebase改变历史, 永远不要用在master分之,别人有可能使用你的分之时也不要用
 # only change history for commits that have not yet been pushed
 # master has changed since I stared my feature branch, and I want bo bring my branch up to date with master. - Dont't merge. rebase
 # rebase: finds the merge base; cherry-picks all commits; reassigns the branch pointer.
 # then git push -f
 # git rebase --abort

 # 全局 ignore, 对于不同编辑器协作的人比较有用,或者用来单独忽略一些自己建立的测试文件等。
 # NOTE: git 支持每个子文件夹下有一个自己的 .gitignore,文件路径也是相对当前文件夹
 git config --global core.excludesfile ~/.gitignore_global  # 全局忽略一些文件

 # 拉取别人远程分支,在 .git/config 里配置好
 git fetch somebody somebranch
 git checkout -b somebranch origin/somebranch

 # prune all the dead branches from all the remotes
 # https://stackoverflow.com/questions/17933401/how-do-i-remove-deleted-branch-names-from-autocomplete?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
 git fetch --prune --all # 清理本地本删除的远程分之,补全的时候很干净,没有已经删除的分之

 # https://stackoverflow.com/questions/1274057/how-to-make-git-forget-about-a-file-that-was-tracked-but-is-now-in-gitignore
 # https://wildlyinaccurate.com/git-ignore-changes-in-already-tracked-files/
 # 如果一个文件已经被 git 跟踪但是你之后又不想提交针对它的修改了,可以这么做(比如我想修改一些配置,本地 debug 等)
 git update-index --assume-unchanged <file>    # 忽略一个已经 tracked 的文件,修改后不会被 commit
 git update-index --no-assume-unchanged <file>   # undo 上一步
 # 那如何列出这些文件呢? https://stackoverflow.com/questions/2363197/can-i-get-a-list-of-files-marked-assume-unchanged
 git ls-files -v | grep '^[[:lower:]]'

 # https://stackoverflow.com/questions/48341920/git-branch-command-behaves-like-less
 # 禁止 git brach 的时候使用交互式
 git config --global pager.branch false

 # git rm file and add, https://stackoverflow.com/questions/9591407/unstage-a-deleted-file-in-git/9591612
 # this restores the file status in the index
 git reset -- <file>
 # then check out a copy from the index
 git checkout -- <file>

 # git 注意不要把二进制大文件,视频文件等放入到版本库,可能会导致 .git 非常大,删了也无济于事
find . -executable -type f >>.gitignore # https://stackoverflow.com/questions/5711120/gitignore-without-binary-files

# 如何恢复一个已经删除的分之, https://stackoverflow.com/questions/3640764/can-i-recover-a-branch-after-its-deletion-in-git
git reflog  # 查找对应 commit hash
git checkout -b branch-name hash

 # git 如何使用不同的 committer,除了每个项目和全局可以设置 gitconfig 里的 user 外,可以使用如下方式
 # https://stackoverflow.com/questions/4220416/can-i-specify-multiple-users-for-myself-in-gitconfig
 # global config ~/.gitconfig
 [user]
     name = John Doe
     email = john@doe.tld

 [includeIf "gitdir:~/work/"]
     path = ~/work/.gitconfig

 # ~/work/.gitconfig
 [user]
     email = john.doe@company.tld