Top Related Projects
Most commonly used git tips and tricks.
Flight rules for git
Pro Git 2nd Edition
A collection of useful .gitignore templates
Quick Overview
Git-Tutorials is a comprehensive guide to Git and GitHub, created by twtrubiks. It provides detailed explanations, examples, and best practices for using Git and GitHub effectively. The repository is primarily written in Chinese, with some English content, making it particularly useful for Chinese-speaking developers.
Pros
- Extensive coverage of Git and GitHub features and workflows
- Includes practical examples and real-world scenarios
- Regularly updated with new content and improvements
- Offers both basic and advanced topics for users of different skill levels
Cons
- Primarily written in Chinese, which may limit accessibility for non-Chinese speakers
- Some sections may lack depth compared to official documentation
- Navigation can be challenging due to the large amount of content
- May not cover some of the latest Git and GitHub features
Getting Started
To get started with Git-Tutorials:
- Visit the repository at https://github.com/twtrubiks/Git-Tutorials
- Clone the repository to your local machine:
git clone https://github.com/twtrubiks/Git-Tutorials.git
- Navigate through the README.md file to find topics of interest
- Explore individual markdown files for detailed explanations and examples
Note: This is not a code library, so there are no code examples or installation instructions. The repository serves as a learning resource and reference guide for Git and GitHub usage.
Competitor Comparisons
Most commonly used git tips and tricks.
Pros of tips
- Extensive collection of Git tips and tricks (1000+)
- Organized by categories for easy navigation
- Includes advanced Git techniques and lesser-known commands
Cons of tips
- Lacks detailed explanations for each tip
- No step-by-step tutorials or visual aids
- May be overwhelming for Git beginners
Code Comparison
tips:
git log --pretty=format:"%C(yellow)%h%Cred%d %Creset%s%Cblue [%cn]" --decorate
Git-Tutorials:
git log --oneline --graph --decorate --all
Both repositories provide useful Git commands, but tips focuses on concise one-liners, while Git-Tutorials offers more context and explanations.
Summary
tips is a comprehensive collection of Git commands and techniques, ideal for experienced users looking for quick references. Git-Tutorials, on the other hand, provides more detailed explanations and tutorials, making it better suited for beginners or those seeking in-depth understanding of Git concepts.
tips excels in breadth of content and organization, while Git-Tutorials offers a more structured learning approach with visual aids and step-by-step guides. The choice between the two depends on the user's experience level and learning preferences.
Flight rules for git
Pros of git-flight-rules
- More comprehensive coverage of Git scenarios and solutions
- Well-organized with a detailed table of contents
- Regularly updated with contributions from the community
Cons of git-flight-rules
- May be overwhelming for Git beginners due to its extensive content
- Lacks visual aids or diagrams to illustrate concepts
Code comparison
git-flight-rules:
git config --global alias.undo-commit 'reset --soft HEAD^'
git undo-commit
Git-Tutorials:
git reset HEAD^
Summary
git-flight-rules offers a more extensive collection of Git scenarios and solutions, making it an excellent resource for intermediate to advanced users. It benefits from regular community contributions and a well-structured table of contents. However, its comprehensive nature might be overwhelming for beginners.
Git-Tutorials, on the other hand, provides a more concise and beginner-friendly approach to learning Git. It may not cover as many advanced scenarios but offers a gentler learning curve for those new to version control.
Both repositories serve different purposes and cater to different skill levels, making them complementary resources for Git users at various stages of their learning journey.
Pro Git 2nd Edition
Pros of progit2
- Comprehensive coverage of Git, including advanced topics
- Available in multiple languages and formats (PDF, EPUB, MOBI)
- Regularly updated with contributions from the community
Cons of progit2
- More complex and potentially overwhelming for beginners
- Requires more time investment to read and understand fully
Code comparison
progit2 (Asciidoc format):
==== Git Aliases
[source,console]
----
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
----
Git-Tutorials (Markdown format):
## git alias
```cmd
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
### Summary
progit2 is a comprehensive Git resource available in multiple formats and languages, suitable for users seeking in-depth knowledge. Git-Tutorials offers a more concise, beginner-friendly approach with practical examples and explanations in Markdown format. While progit2 covers advanced topics, Git-Tutorials focuses on essential concepts and common use cases. The code comparison shows similar content presented in different formats, with progit2 using Asciidoc and Git-Tutorials using Markdown.
A collection of useful .gitignore templates
Pros of gitignore
- Comprehensive collection of .gitignore templates for various languages and frameworks
- Regularly updated and maintained by the GitHub community
- Easily accessible and can be directly used in GitHub repositories
Cons of gitignore
- Focused solely on .gitignore files, lacking broader Git tutorial content
- May require additional research to understand the purpose of specific ignore patterns
- Limited explanations or context provided for each template
Code Comparison
Git-Tutorials:
git init
git add .
git commit -m "first commit"
git remote add origin [GitHub Repository URL]
git push -u origin master
gitignore:
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
Summary
Git-Tutorials provides a comprehensive guide to Git usage, covering various commands and workflows. It's ideal for beginners learning Git and GitHub. On the other hand, gitignore focuses specifically on providing .gitignore templates for different programming languages and environments. While Git-Tutorials offers a broader educational approach, gitignore serves as a practical resource for quickly setting up appropriate file ignoring patterns in projects.
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
Git-Tutorials åºæ¬ä½¿ç¨æå¸ :memo:
å çºå°å¼è¦ºå¾éæ±è¥¿è »æè¶£çï¼æä»¥å°±ç°¡å®å¯«åæå¸æï¼é 便è¨éä¸ä¸ :memo:ï¼å¸æè½å¹«å©æ³å¸ç人 :smile:
妿æå¸æèª¤åè«ç³¾æ£ :sweat_smile:
åºæ¬ä½¿ç¨æä»¤ä»¥åå®è£å¯åèå°å¼ä¹åæçå½±ç
å½±çæå¸å å«å¦ä½ç¢ç SSH key
妿æ¥é©æ£ç¢ºä¸æ²åºé¯èª¤ï¼å¯ä»¥å¨è·¯å¾ä¸æ¾å° .sshè³æå¤¾ï¼è£¡é¢æ id_rsa 以å id_rsa.pub å ©åæªæ¡ï¼
éå ©åå°±æ¯ SSH Keyï¼ id_rsaæ¯ç§é° ï¼ä¸è½æ´©é²åºå»ï¼ id_rsa.pubæ¯å ¬é° ï¼å¯ä»¥å¾æ¾å¿çå訴任ä½äººã
å®è£å® Git ä¹å¾ï¼è¦åç第ä¸ä»¶äºæ å°±æ¯å»è¨å®èªå·±çåååä¿¡ç®±
git config --global user.name "twtrubiks"
git config --global user.email "twtrubiks@gmail.com"
å¯ä»¥è¼¸å ¥ä»¥ä¸ä¾ç¢ºèªæ¯å¦è¼¸å ¥æå
git config --global user.name
git config --global user.email
Git è¨å®è³ææ¥çï¼å¯å·è¡ä»¥ä¸æä»¤ ( æç« æ«ææè¼è©³ç´°çæå¸ )ï¼
git config --list
git init æä»¤
åå§å git
git init
ä¹å¯ä»¥æå®è³æå¤¾
git init <directory>
git clone æä»¤
è¤è£½å¦åä½ç½®ç¶²å ( ä¸è¦è¤è£½æçå¦~ è¤è£½ä½ èªå·±ç )
git clone ( è¤è£½çç¶²å ) SSH / HTTPS
( å¦æä½ è¦ä½¿ç¨ https çæ¹å¼, è«æ¥èç Personal Access Tokens )
git clone git@github.com:twtrubiks/test.git
ç¬¬ä¸æ¬¡æåºç¾ SSH è¦åï¼é¸ YES å³å¯ã
å¦å ( ä¸è¼æå )ï¼å¨ä½ çä¸è¼è·¯å¾ä¸å°±æå¤åºä¸åè³æå¤¾
Personal Access Tokens
å¾ 2021/8/13 éå§, å¦æä½ ç¨ https çæ¹å¼ä½ æç¼ç¾
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/xxxxx.git/'
éæå妿æå䏿³å å ¥ ssh key, ä¹ä¸æ³ééå å ¥å ±åååçæ¹å¼,
å¯ä»¥éééå Personal Access Tokens (ä½ å¯ä»¥æä»æ³æè¨æçæ¬é),
å å°ä½ ç github 裡ç Settings -> Developer settings,
é¸ Personal Access Tokens, ç¢çä½ ç token
æéééä½ å¯ä»¥èªå·±å®ç¾©å¤ä¹ 徿éæ,
ä¸é¢çé¨ä»½åæ¯éå token æåªäºæ¬é,
è¨å®å®ä¹å¾, å°±å¯ä»¥è¤è£½ä½ ç token
ååå»ç¨ https clone çæ¹å¼,
忬æ¯ä½¿ç¨, 帳è + password (å·²ç¶ä¸è½ä½¿ç¨äº),
ç¾å¨æ¹æ, 帳è + ååç token å°±å¯ä»¥é å© clone äº.
å¦ä½æ¹å(å é)大å repo git clone é度
ææåæåæéè¦ clone å¾å¤§ç repoï¼å·è¡ git clone
é½éè¦å¾é·çæéï¼æ¯ä¸æ¯ææ¹æ³å¯ä»¥
å é clone çéåº¦å¢ :question:
ç´æ¥éå§åæå試 ( ä½¿ç¨ django ç¶ç¯ä¾ )ï¼
git clone git@github.com:django/django.git
( ä½ æç¼ç¾ clone éè¦ä¸äºæé :triumph:)
æ¥èæ¥ç logï¼git log
åè©¦åæ branch git checkout stable/2.2.x
éå§æ¹å(å é) clone çæéï¼
å¯ä»¥éé --depth
éå忏ä¾å®æï¼ç°¡å®èªªæä¸ä¸ä»çåè½ï¼ç¶æåä¸è¬å·è¡ clone ä¹å¾ï¼
æ¥èå·è¡ git log
ä½ æç¼ç¾æå¤§éç logï¼å¨æä¿®æ
æ³ä¸ï¼ä½ å¯è½ä¸éè¦é£éº¼å¤ç logï¼
ä¹å°±æ¯èªªä½ å¯è½åªéè¦æè¿ 10 çç history commitï¼çè³ä½ åªéè¦ 1 ç ( ä¹å°±æ¯æ ¹æ¬ä¸éè¦
history commit )ï¼éæåå°±å¾é©åä½¿ç¨ --depth
ã
git clone git@github.com:django/django.git --depth 1
( ä½ æç¼ç¾é次快å¾å¤äº )
æ¥èæ¥ç logï¼git log
( æè®å¿«çåå æ¯å çºæååªä¿çææ°çä¸ç history commit ï¼
å¦æä½ éè¦æè¿ 10 çï¼æ¹æ --depth 10 å³å¯ )
使¯ææä¸ååé¡ï¼ç¶åè©¦åæ branch git checkout stable/2.2.x
( ä½ æç¼ç¾ä½ ç¡æ³åæ remote branch :scream:
åå æ¯å çºä½¿ç¨ --depth
ç¸ç¶æ¼æ¯ --single-branch
ï¼
æä»¥ç¶ç¶æ²æå ¶ä»ç branchã )
ä¹å°±æ¯èªªä»¥ä¸å ©æ¢æä»¤å ¶å¯¦æ¯ç¸çç
git clone git@github.com:django/django.git --depth 1
git clone git@github.com:django/django.git --depth 1 --single-branch
çºäºè§£æ±ºéååé¡ï¼æ¯è¼å¥½çå好æè©²æ¯é樣
git clone git@github.com:django/django.git --depth 1 --no-single-branch
( éåå --single-branch
æ¯æç¨å¾®ä¹
ä¸é»é»ï¼å çºæ¯å branch çææ°ä¸å history commit é½è¦ clone ä¸ä¾ )
鿍£ç話ï¼å°±å¯ä»¥ä¿ç remote ç branch äºï¼
æååæ remote ç branchï¼ git checkout stable/2.2.x
ã
æå¾ç¨å¾®æ´çï¼
å¦è¦ clone æè¿ä¸æ¬¡ç historyï¼èä¸ä¹éè¦å ¶ä» branchï¼ä½¿ç¨å¦ä¸ï¼
git clone git@github.com:django/django.git --depth 1 --no-single-branch
å¦æä½ æ³è¦æå®åæ¯, å ä¸ -b
,
git clone git@github.com:django/django.git --depth 1 --no-single-branch -b stable/3.1.x
å¦è¦ clone æè¿ä¸æ¬¡ç historyï¼èä¸ä¸éè¦å ¶ä» branchï¼ä½¿ç¨å¦ä¸ï¼
git clone git@github.com:django/django.git --depth 1 --single-branch
or
git clone git@github.com:django/django.git --depth 1
æ´å¤è©³ç´°åæ¸èªªæè«åè git clone
git status æä»¤
git status
å¯ä»¥è®æåè§çç®åç repository ( repo å®¹å¨ )ã
æææ¯ç®åä½ çå·¥ä½åæ¯ä¹¾æ·¨çã
å·¥ä½åèæ«åå ( Stage )
git add æææ¯æè¦éåºçæä»¶æ¾å°æ«åå ( Stage ) ï¼
ç¶å¾å·è¡
git commit å°±å¯ä»¥ææ«åå ( Stage ) 裡ææä¿®æ¹çå §å®¹éå°ç®åç忝ä¸ã
䏿¦éåº ( git commit ) å¾ï¼å¦æä½ åæ²æå°å·¥ä½ååä»»ä½ä¿®æ¹ï¼é£éº¼å·¥ä½åå°±æ¯"乾淨"çã
git commit -m "xxxxx" æä»¤ï¼-m å¾é¢è¼¸å ¥çå §å®¹æ¯æ¬æ¬¡ä¿®æ¹ ( éåº ) ç說æï¼
ç¡éè¼¸å ¥ä¸ç¼å°±å¯ä»¥çåºé次éåºä¿®æ¹äºä»éº¼çå §å®¹ ( æ¹ä¾¿ä»¥å¾åå»è§çè½å¿«éäºè§£æ¤æ¬¡ commit ä¿®æ¹äºä»éº¼ )ã
ä»¥ä¸ demo çºå¨ä¸åè³æå¤¾å §æ°å¢ä¸å Hello.py æªæ¡
ç¶å¾ä½¿ç¨ git status è§çç®åç repository ( repo å®¹å¨ )ï¼ä½ æçå° Hello.py æªè¢«è¿½è¹¤ï¼å¦ä¸å
å¯ä»¥ä½¿ç¨å¦ä¸æä»¤
git add Hello.py
é¡å¤è£å ï¼ä¸é¢éåæä»¤å¾æè¶£ï¼å¤§å®¶å¯ä»¥ç©ç©ç
git add -p
æ¥èå使ç¨
git commit -m "æå"
git commit -m "add Hello.py"
åä½¿ç¨ git statusï¼ä½ æç¼ç¾å·¥ä½åè®ä¹¾æ·¨äºãå¦ä¸å
è£å ï¼å¦æåªæè¼¸å ¥
git commit
éææè·³åºç·¨è¼¯è¦çª
éæå¯ä»¥æéµç¤ç Inséµ ( ææéµç¤ä¸ç è±æå i ) å³å¯è¼¸å ¥æå
è¼¸å ¥å®å æ Escéµ ï¼æå®å¾åºä¸ç INSERT ææ¶å¤±ï¼æ¥èç´æ¥æ :wq ï¼åæ enter å°±æå²å並é¢éäºã
æ´å¤åæ¸å¯åè https://git-scm.com/docs/git-commit 說æã
å¦ä½ä¿®æ¹æå¾ä¸æ¬¡çcommitå¢ ?
ææåæå commit å®ä¹å¾ï¼æç¼ç¾èªå·±ç commit å §å®¹ææ®æé¯äº
éæåå¯ä»¥ä½¿ç¨å¦ä¸æä»¤ï¼ä»æè·³åºç·¨è¼¯è¦çªçµ¦ä½ ç·¨è¼¯ä½ ä¸ä¸æ¬¡ç commit å §å®¹ã
git commit --amend
åææ¯æå commit å®ä¹å¾ï¼æç¼ç¾èªå·±æ¼äºå¹¾åæªæ¡æ²æ add é²å»
éæåå¯ä»¥ä½¿ç¨å¦ä¸æä»¤
git commit -m "init commit"
git add missing_file.py
git commit --amend
å¦ä¸çæ³çºç¶æ git commit -m "init commit" ä¹å¾ï¼
æç¼ç¾ææ¼æäº missing_file.py éåæªæ¡ ( commit åå¿è¨ add é²å» ) ï¼
éæåå°±å¯ä»¥ä½¿ç¨ git commit --amend ä¾ä¿®æ¹æå¾ä¸æ¬¡ç commit ã
ææåæåæçºäºæ¹ä¾¿ï¼ç´æ¥ä½¿ç¨ä¸é¢çæä»¤ä¸æ¬¡å å ¥å ¨é¨çæªæ¡
git add .
使¯å å®å¾ç¼ç¾å ¶å¯¦æäºæªæ¡æ¯ä¸éè¦ add é²å ¥çï¼éæåå°±å¯ä»¥ä½¿ç¨å¦ä¸æä»¤å»åæ¶ add
git reset HEAD <file>
ç¯ä¾ï¼è·¯å¾ä¸æ A.py 以å B.py éå
©åæªæ¡ï¼ç¶å¾æä½¿ç¨ git add . å å
¥ï¼
ä½å å ¥å®æç¼ç¾å ¶å¯¦ B.py æéæ²æè¦ add é²å ¥ï¼æä»¥æéæåå°±å¯ä»¥ä½¿ç¨ git reset HEAD B.py å»éåã
git push æä»¤
git push
å°ç¨å¼ push å° github ( or bitbucket ä¹é¡ )ä¸ , å¦ä¸å
çæ¬æ§å¶ - æ·å²è¨é
git log
æ å°å¯«q å¯éåº
å¦æè¦ºå¾çé¢å¤ªéï¼å¯ä»¥ä½¿ç¨ä¸åæä»¤
git log --pretty=oneline
æ å°å¯«q å¯éåº
å¦æä½ æ³è¦çæåæªæ¡ææåè³æå¤¾çè®å, å¯ä»¥é樣使ç¨, ç¯ä¾å¦ä¸
git log -- folder
å¦æè¿½è¹¤å奿ªæ¡, å¯ä»¥å ä¸ --follow
git log --follow -- folder/demo.py
èåä¾å, ææä¸åè³æå¤¾çµæ§å¦ä¸
⯠tree
.
âââ production
â  âââ a
â  â  âââ a1.txt
â  â  âââ a2.txt
â  â  âââ a3.txt
â  âââ b
â  âââ b1.txt
âââ test
production
ä¸çæ·å²ç´é
⯠git log -- production/a
* b9a481b - a3.txt
* 02fce19 - a2.txt
* 1e4aa1b - create
åè¨ä»å¤©æ production
åºä¸ç a
è³æå¤¾ç§»åå° test
è³æå¤¾åºä¸,
è³æå¤¾çµæ§è®æå¦ä¸, ç¶å¾ commit
⯠tree
.
âââ production
â  âââ b
â  âââ b1.txt
âââ test
âââ a
âââ a1.txt
âââ a2.txt
âââ a3.txt
ç®åæ´å repo ç git log å¦ä¸
⯠git log
* 5707ce2 - move
* b9a481b - a3.txt
* 02fce19 - a2.txt
* 1e4aa1b - create
* 1b7fb87 - Initial commit
ç¶å¾åç a
è³æå¤¾, å¦ä¸
⯠git log -- test/a
* 5707ce2 - move
ä½ æç¼ç¾åé¢ç a2.txt
以å a3.txt
ç git ç追蹤ç´éæ¶å¤±äº !!!
æ¹æ³ä¸, 追蹤åè³æå¤¾,
éç¶éåæªæ¡å·²ç¶ä¸åå¨äº, 使¯å° git ä¾èªªç´é鿝å¨ç
# ééä½ æç¼ç¾è³æå¤¾å·²ç¶ä¸åå¨ç, å çºå·²ç¶ç§»åäº
⯠ls production/a
ls: cannot access 'production/a': No such file or directory
# 使¯éæ¯å¯ä»¥è¿½è¹¤å°æ·å²ç´é
⯠git log -- production/a
* 5707ce2 - move
* b9a481b - a3.txt
* 02fce19 - a2.txt
* 1e4aa1b - create
æ¹æ³äº, å ä¸ --follow
, éåå¯ä»¥è¿½è¹¤å奿ªæ¡ (ç§»åå¾çè³æå¤¾ä¸è¦ç¨å®, å çºæçä¸å°éå»ç´é)
⯠git log --follow -- test/a/a1.txt
* 5707ce2 - move
* 1e4aa1b - create
å¦å¤åºä¸ä¹æ¯ä¸åç log çæ¹å¼ï¼ å¾é · :satisfied:ï¼ï¼æ GUI çæè¦ºï¼ 便ºçºæç« æå¾çé£çµ ï¼
git log --graph --pretty=format:"%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset" --abbrev-commit --date=relative
Git ä¸ï¼ä½¿ç¨ HEAD 表示ç®åççæ¬ï¼
git reset --hard HEAD
妿ç¾å¨è¦æç®åçæ¬éåå°ä¸ä¸åçæ¬ï¼å°±å¯ä»¥ä½¿ç¨ git reset æä»¤ï¼
ä¸ä¸åçæ¬å°±æ¯HEAD~1ï¼
git reset --hard HEAD~1
ä¸ä¸ä¸åçæ¬å°±æ¯HEAD~2ï¼
å¦æè¦æå®åå°æåç¹å®çæ¬ï¼
git reset --hard ad41df36b7
--hard
éååæ¸ï¼æä¸ç¨®é¸æï¼åå¥çº --mixed
( default ï¼--hard
--soft
ï¼
--hard
éååæ¸ç°¡å®è§£éå°±æ¯å°ä¹åç commit é½ä¸æï¼ å®å
¨ ä¸ä¿ç ï¼ã
--soft
éååæ¸ç°¡å®è§£éå°±æ¯å°ä¹åç commit é½ä¸æï¼ä½ ä¿ç ä½ ä¹åå·¥ä½åççæ
ã
--hard
å --soft
éå
©åæè¦ºå¾ç¨æåä¸å¥½èªªæï¼æå»ºè°å¤§å®¶èªå·±å¯ä»¥åæç©ç©çï¼å°±å¯ä»¥äºè§£ä»åä¹éçå·®ç°ã
--soft
å¾é©å使ç¨å¨å°å¤åç¡æç¾©ç commit åä½µæä¸å commitã
çæ¬è ( ad41df36b7 ) æ²å¿ è¦å ¨é¨é½å¯«ï¼å¯«åå¹¾ä½å°±å¯ä»¥äºï¼Git æèªå廿¾ã
ç¶ä½ éåå°æåçæ¬ï¼çªç¶é天徿äºï¼æ³æ¢å¾©å°ä¹åçæ°çæ¬è©²æéº¼åå¢?
æ¾ä¸å°æ°çæ¬ç commit id 該æéº¼è¾¦å¢?
éæåå°±å¯ä»¥ä½¿ç¨ä¸åæä»¤
git reflog
æ¥èçä½ è¦åå°åªåçæ¬ï¼åä½¿ç¨ git reset å³å¯ã
git reset --hard 642e7af
ææåæ³æ¶é¤( è¦è )å·²ç¶ push åºå»ç commitï¼éæåæåå¯ä»¥ä½¿ç¨
git push --force
ææ¯æ´ç°¡çç寫æ³
git push -f
å¯ä»¥å¼·å¶ pushãå åå°æåçæ¬ï¼ç¶å¾åå¼·å¶ pushã
注æï¼å¨å¤äººå°æ¡å ±åéç¼æï¼ç¡éä¸è¦ç¨ --force éç¨®æ¹æ³ï¼å çºææåæå®³å°å¥äººï¼å»ºè°å¯ä»¥ä½¿ç¨ revert ã
å çºä¸é¢éååå ï¼æä»¥å»ºè°ç¨å¦ä¸ç¨®æ¯è¼å®å ¨çæ¹å¼
git push --force-with-lease
å¯ä»¥ç¢ºä¿ä½ æ²æé¨ä¾¿ä¸æå¥äººç commitãï¼ å¦ææäººæ¯ä½ æ© commit push ä¸å»ï¼ä½ å°±æç¡æ³ push å° remote ï¼
checkout
ä¹è«åè git switch å git restore.
git checkout -- file
å¯ä»¥ä¸æ£å·¥ä½åçä¿®æ¹ï¼
git checkout -- hello.py
å½ä»¤ git checkout -- hello.py ææå°±æ¯ï¼æ hello.py æä»¶å¨å·¥ä½åçä¿®æ¹å ¨é¨æ¤é· ( 䏿£ ) ï¼
è®éåæªæ¡åå°æè¿ä¸æ¬¡ git commit æ git add æççæ ã
ç¶ç¶ä¹å¯ä»¥ç¨ git reset æä»¤ç´æ¥åå°æå commitã
git reset --hard xxxxxx
git reset --hard 201f40604ec3b6fa8
åªé¤
æå ©ç¨®çæ³ï¼ä¸ç¨®æ¯ç¢ºå®è¦å¾çæ¬åº«ä¸åªé¤è©²æªæ¡ï¼é£å°±ç¨å½ä»¤ git rm åªæï¼ä¸¦ä¸ git commitï¼
rm hello.py
git rm hello.py
git commit -m "remove hello.py"
å¦ä¸ç¨®çæ³æ¯åªé¯äºï¼ä½¿ç¨ git checkout å¯ä»¥è¼é¬éåæªæ¡:
rm hello.py
git checkout -- hello.py
æ°å»ºè åä½µ ( merge ) 忝 branch
å¨èªªæåæ¯ branch ä¹åï¼å 給大家ä¸åè§å¿µã
é常éç¼çæåï¼å¤§å®¶é½æ¯å¾ master åä¸å忝 branch åºå»ï¼æå¾å merge å masterï¼
çºä»éº¼è¦é麼åå¢ ? å çºè¦ç¢ºä¿å¤§å®¶é½æ¯ä½¿ç¨ææ°ç master
ä½¿ç¨ git branch æä»¤æ¥çç®åç忝ï¼
git branch
é¦å åµå»ºä¸å忝ï¼bug1 忝 ( å稱å¯ä»¥é¨ä¾¿å )ï¼ç¶å¾åæå° bug1 忝ï¼
git branch bug1
git checkout bug1
git branch bug1 çºåµé ä¸ååç¨±çº bug1 ç忝ï¼
git checkout bug1 çºåæå°ä¸ååç¨±çº bug1 ç忝åºä¸ã
以ä¸å ©è¡æä»¤ï¼ç¸ç¶æ¼ä¸åä¸è¡æä»¤
git checkout -b bug1
(ééæå¤§å®¶ä¸åå°æå·§, 以ä¸éåæä»¤å¯ä»¥å¿«éåæä¸ä¸å忝, å cd -
æ¦å¿µä¸æ¨£ :exclamation:)
git checkout -
æåå¨ bug1 忝ä¸é²è¡ä»»ä½ä¿®æ¹æä½ï¼
ç¶å¾åæå·¥ä½ææ ( è£å ä¸ä¸ï¼ä¿®æ¹ä»»ä½å §å®¹å¾è«è¨å¾ä½¿ç¨ git add æä»¤å git commit æä»¤ ) åä½µå° master 忝ä¸ï¼
git checkout master
git merge bug1
git checkout master çºåæå°ä¸ååç¨±çº master ç忝åºä¸ã
git merge bug1 æä»¤ç¨æ¼åä½µ ( bug1忝 ) æå®åæ¯å°ç®å忝 ( master ) åºä¸ã
妿é常é å©ï¼ git merge çè¨æ¯è£¡æåºç¾ Fast-forwardï¼åä½µé度é常快ã
ç¶ç¶ä¸æ¯æ¯æ¬¡åä½µé½è½å¾é å©çåºç¾ Fast-forwardï¼å¾å¤æåæåºç¾è¡çª CONFLICT ã
妿é å©åä½µ ( merge ) 宿å¾ï¼å°±å¯ä»¥åªé¤ (æ¬æ©) bug1 忝ï¼
git branch -d dev
妿è¦ä¸æä¸åæ²æè¢«åä½µéç忝ï¼å¯ä»¥ä½¿ç¨ git branch -D 忝å稱 å¼·è¡åªé¤ (æ¬æ©)ã
git branch -D dev
é£å¦æä»å¤©è¦åªé¤ remote 端ç branch 該æéº¼è¾¦å¢ :question:
git push origin --delete {remote_branch}
è£å ï¼git branch ä¹å¯ä»¥ä¿®æ¹å稱ï¼èä¸ commit id æ¯ä¸ææ¹è®çï¼ä½¿ç¨æ¹æ³ä¹å¾ç°¡å®ï¼
å¯åè git-branch æä»¶ï¼ä½¿ç¨æ¹æ³å¦ä¸ï¼
git branch -m <name>
忬ç b1 branch 忝ç log å¦ä¸ï¼
ç¾å¨å° b1 branch ä¿®æ¹æ b2 branchï¼
å¦æä½ ä»ç´°åååç log æ¯è¼ï¼ä½ æç¼ç¾ log ç commit id æ¯ä¸ææ¹è®çï¼
使ç¨ç¹å® commit id å»ºç« branch
ææåæåææ³æ¸¬è©¦æå commit ççæ , éæåå¯ä»¥ç´æ¥å©ç¨ commit id å»å»ºç«ä¸å branch,
æ¹æ³å¦ä¸,
git checkout -b new_branch <commit id>
鿍£å°±æä¾ç §ä½ æå®ç commit id å»å»ºç«åºä¸å branch.
æ°å»ºåæ¯ branch 並 push
ç¸ä¿¡å¤§å®¶ææåå¨ github ä¸é¢é½æçå°ï¼å¦ä¸åï¼å¾å¤åæ¯
飿åè¦å¦ä½å»ºç«åæ¯å¢? é¦å ï¼æåå çä¸é¢éå¼µå
æä¸å v1 ç忝ï¼ä¸¦ä¸æå¨åæ¯ä¸å¢å ä¸å g.py ä¸¦ä¸ commitã
æ¥ä¸ä¾è¦ ç¬¬ä¸æ¬¡ git push çæåï¼ ä½ æç¼ç¾æé¯èª¤æç¤º
è«ä½¿ç¨ä»¥ä¸æä»¤ææ¯æ£ç¢ºç
git push --set-upstream origin v1
ä¹å¯ä»¥ä½¿ç¨
git push -u origin v1
æ´å¤è©³ç´°èªªæå¯åè https://git-scm.com/docs/git-push#git-push--u
æ¥ä¸ä¾ä½ å¯ä»¥å°ç¶²é ä¸ç ( éè£¡ç¨ bitbucket ç¶ä½ç¯ä¾ ) ï¼ä½ æç¼ç¾æåæ¯ v1 äº
妿æ¯ç¬¬ä¸æ¬¡ä½¿ç¨ git clone ï¼ä½ æç¼ç¾ä½ åªæ master 忝 ï¼
éæåæåå æ¥çé 端éæä»éº¼åæ¯ï¼
git branch -r
git branch --remote
--remote
æ -r
é½å¯ä»¥.
åè¨é 端æä¸ååç¨±çº develop ç忝ï¼
æååªè¦ checkout å°è©²åæ¯åºä¸å°±å¯ä»¥äº
git checkout develop
git switch
Youtube Tutorial - git switch å git restore æå¸
è«å 確èªç®åç git çæ¬, æ´æ°æ¹æ³å¯åè git æ´æ°.
å¨ git 2.23 çæ¬éå§, å¢å äº git switch
å git restore
, éå
©åæä»¤ä¸»è¦æ¯
è¦æ´æ¸
æ¥çåååè½, ä¸»è¦æ¯ä¾ä»£æ¿ git checkout
.
ä½ å
¶å¯¦å¯ä»¥æ³æ git checkout
= git switch
+ git restore
.
宿¹æä»¶å¯åè git-switch
git switch [<options>] (-c|-C) <new-branch> [<start-point>]
åæå°ä¸åå·²ç¶åå¨ç branch (å¦æè©² branch ä¸åå¨åæä»¤ç¡æ)
git switch <new-branch>
å»ºç« new-branch 並ä¸åæå° new-branch 忝
git switch -c <new-branch>
-c
--create
-C
--force-create
ä¾ç § commit_id (æå N ç commit é») å»ºç« new-branch 並ä¸åæå° new-branch 忝
git switch -c <new-branch> <commit_id>
git switch -c <new-branch> HEAD~2
(ééæå¤§å®¶ä¸åå°æå·§, 以ä¸éåæä»¤å¯ä»¥å¿«éåæä¸ä¸å忝, å cd -
æ¦å¿µä¸æ¨£ :smile:)
git switch -
git restore
Youtube Tutorial - git switch å git restore æå¸
è«å 確èªç®åç git çæ¬, æ´æ°æ¹æ³å¯åè git æ´æ°.
å¨ git 2.23 çæ¬éå§, å¢å äº git switch
å git restore
, éå
©åæä»¤ä¸»è¦æ¯
è¦æ´æ¸
æ¥çåååè½, ä¸»è¦æ¯ä¾ä»£æ¿ git checkout
.
ä½ å
¶å¯¦å¯ä»¥æ³æ git checkout
= git switch
+ git restore
.
宿¹æä»¶å¯åè git-restore
以ä¸å ©åæä»¤æ¯ç¸åç.
git checkout <file>
git restore <file>
éåç®åè³æå¤¾å ¨é¨çæªæ¡
git restore .
éåç®åè³æå¤¾åºä¸çµå°¾æ¯ *.py
çå
¨é¨æªæ¡
git restore '*.py'
å¦æä½ ç git
çæ¬æ¯è¼æ°, ä½ æè©²æç¼ç¾éåæä»¤ä½ 以å好忲çé :smile:
git restore --staged <file>
git pull
é常å¨éå§å·¥ä½æè¦ push ä¹åï¼æå å¾é 端æå忝ï¼
git pull
妿æè¡çªï¼è¦å è§£è¡çªã
ééè£å
ä¸ä¸ -C
éååæ¸çææ, å®çææä»£è¡¨æå® folder è·¯å¾,
ææåæåå¯è½ä¸æ³å
cd
é²å»è³æå¤¾, åé²è¡ pull, éæå,
å°±å¾é©å使ç¨å® :smile:
git [-C <path>] pull
èä¾,
cd git_folder
git pull
å¯ä»¥ç´æ¥ç°¡åçº
git -C git_folder pull
git fetch
å¯ä»¥å ç°¡å®æ³æ git pull = git fetch + git merge
æåå ä¾çä¸é¢éå¼µåï¼ git fetch + git merge
åçéå¼µå git pull
鿍£æ¯ä¸æ¯æ¸ æ¥å¤äº!!!
å¤è£å
ä¸å忏 --prune
,
éå主è¦çåè½æ¯åªé¤ remote ç¡æç branch,
ææåææå·²ç¶æé 端ç branch åªé¤, 使¯ä½ å·è¡ git branch --remote
,
廿ç¼ç¾ä½ éççå°é£äº branch ç忝 (使æç¶²é ä¸ç忝已ç¶è¢«ç§»é¤äº :sweat:)
常常æç¼çå¨ pull 端(éå·¥ä½ç«¯)çæ©å¨ (妿䏿éå¥è©±çææå»ºè°çå½±ç說æ :smile:)
éæåå°±å¯ä»¥åæ¥ä¸ä¸æ¬æ©åé 端ç忝, 使ç¨ä»¥ä¸çæä»¤
git fetch --prune
git rebase
ä»éº¼æ¯ rebase å¢ ? git rebase å°±æ¯é¿å å¤é¤ ( æ²ææç¾© ) ç merge !!! å ççä¸é¢å ©å¼µå
è£å :
ck = checkout
br = branch
st = status
cm = commit
å¯ä»¥èªè¡è¨å®ã
åä¸
åäº
åä¸ å åäº ä½ åæ¡çåªç¨®å ? çæ¡å¾æé¡¯ï¼æ¯ åä¸ !!
rebase çç®ç主è¦å°±æ¯ç¡éè®åé½å åä¸
ç¨è¬ç大家ä¸å®é§ç ç ï¼æä»¥æç´æ¥å¯¦æ°çµ¦å¤§å®¶çã
å ç¤ºç¯ æ²æä½¿ç¨ rebase çç¯ä¾
ç®å忝
以ä¸èªªæ : å å»ºç« v1 branchï¼æ¥è add å¾å commitã
åè¨ç¾å¨åæäºº push äºï¼ä»¥ä¸æ¨¡æ¬ pull ï¼èªå·±å ä¸ä¸å commit
以ä¸èªªæ : èªå·±å¨ master 忝ä¸å t2.txt ï¼ ä¸¦ä¸commit ( æ¨¡æ¬ pull )
æ¥ä¸ä¾ï¼åæå° master 忝ä¸å v1 branch 忝 åä½µï¼ä¸¦ä¸ push
ä½ æç¼ç¾ï¼é¡¯ç¤ºåºä¾çå䏦䏿¼äº®ï¼å¦ä¸å
ç¤ºç¯ ä½¿ç¨ rebase çç¯ä¾
åé¢çé¨ä»½åºæ¬ä¸ä¸æ¨£
以ä¸èªªæ : å å»ºç« v1 branchï¼æ¥è add å¾å commitã
åè¨ç¾å¨åæäºº push äºï¼ä»¥ä¸æ¨¡æ¬ pull ï¼èªå·±å ä¸ä¸å commit
以ä¸èªªæ : èªå·±å¨ master 忝ä¸å t2.txt ï¼ ä¸¦ä¸ commit ( æ¨¡æ¬ pull )
å·®ç°çé¨ä»½
以ä¸èªªæ : å åæå° v1 忝ï¼ç¶å¾ä½¿ç¨ä»¥ä¸æä»¤
git rebase master
以ä¸èªªæ : ååå master 忝ï¼ä¸¦ä¸ä½¿ç¨ merge åä½µ v1 åæ¯ï¼æå¾å¨ push
ä½ ç~ æ¯ä¸æ¯è®çæ´é½åæ¼äº®å¤äºå¢?
git rebase å°±æ¯å° master çææ° commit æ¥åä¾ï¼åè£ä¸èªå·±åæ¯ç commitã
以ä¸å°±æ¯ git rebase çä»ç´¹,
å¦ä¸ç¨®ä½æ³, ååæ¯å¿ é åæå° v1 忝åºä¸, æå·è¡æä»¤,
å¦æä½ ç¾å¨å¨ä»»ä½åæ¯(忝 master 忝), ä½ å¯ä»¥ä½¿ç¨ä»¥ä¸æä»¤
git rebase master v1
å°±æ¯å¾é¢æå® v1, å·è¡å®å¾å®æèªåå¹«ä½ åæå° v1 忝ä¸,
çµæé½æ¯ä¸æ¨£ç.
å¦å¤, éæä¸åæä»¤æ¯ git rebase --onto
git rebase --onto <new base-commit> <current base-commit>
å ¶å¯¦æ¦å¿µä¸é½æ¯ä¸æ¨£ç, å°±æ¯ä½ æ³è¦ rebase å°åªå new base-commit ä¸,
å¾é¢æ¾ current base-commit èå·².
å¯ä»¥æé
git graph è§ç, ææ¯ç git çææª git rebase --help
git rebase interactive
å°å¼æç¶åå¹´è¼ï¼ä¸ç´ä»¥çº git rebase
å°±åªæ¯è® commit log çèµ·ä¾æ¯è¼ä¹¾æ·¨èå·²ï¼çµæç¡æéç¼ç¾ï¼
git rebase
ç interactive è¶
å¼·ï¼æä»¥ï¼ééå°±ä¾ä»ç´¹ git rebase
ç強大åè½ :smirk:
以䏿¯ git rebase interactive å¯ä»¥ä½¿ç¨çæä»¤ï¼éäºèªªææ¯æå¾ git ä¸è¤è£½åºä¾çï¼ççæé¡¯ç¤ºçµ¦å¤§å®¶çï¼
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
妿大家æ³è¦æ´é²ä¸æ¥çäºè§£ï¼è«åè INTERACTIVE MODEï¼
pick æ²ä»éº¼å¥½è¬çï¼å°±ä½¿ç¨éå commit èå·² :smile:
reword
Youtube Tutorial - git rebase interactive - reword - PART 1
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
以ä¸çºå®æ¹ç說æ
If you just want to edit the commit message for a commit, replace the command "pick" with the command "reword".
說æå·²ç¶å¾æ¸ æ¥äºï¼å°±æ¯å¯ä»¥ç·¨è¼¯ commit messageã
( ä¸è½ä¿®æ¹ commit å §å®¹ï¼ä¹å°±æ¯ files å §å®¹ )
åè¨ï¼ç¾å¨æåæä¸å git log æ¯é樣ï¼
commit id 2659f65 æ Typoï¼æ£ç¢ºç commit message æè©²æ¯ add c.py æå°ï¼
æä»¥ç¾å¨è¦ä¿®æ£ä»ï¼æåçç®æ¨ commit id çº 2659f65ï¼æä»¤çº
git rebase -i <after-this-commit>
after-this-commit é忝ä»éº¼ææ :question:
ç°¡å®èªªï¼å°±æ¯è¦é¸ç¶ä¸ç commit id çä¸ä¸åï¼
以éåä¾åä¾èªªï¼æåçç®æ¨ commit id çº 2659f65ï¼ä½æä»¤æåå¿ é ä¸
git rebase -i f0a761d
鿍£æè©²å°±å¾æ¸ æ¥äºï¼ç¸½ä¹ï¼è¨å¾è¦é¸æç®æ¨ commit id çä¸ä¸åå°±å°äºã
ç¶ä½ æä¸ ENTER ä¹å¾ï¼ä½ æè©²æçå°ä¸å
A çé¨ä»½å°±æ¯æåè¦ä¿®æ¹çç®æ¨ï¼B çé¨åå°±æ¯èªªæ ( åé¢è²¼çµ¦å¤§å®¶ççæ±è¥¿ )ï¼
æ¥èï¼æ i é²å
¥ç·¨è¼¯æ¨¡å¼ï¼ç¶å¾å°ç®æ¨æ¹æ r ææ¯ reword é½å¯ä»¥ï¼æ¥è輸å
¥ :wq
æ¥èæååæä¸ ENTERï¼æåè·³åºä¸æ¬¡ç«é¢ï¼éæåï¼ä½ å°±å° commit è¨æ¯ä¿®æ¹æ
æ£ç¢ºçï¼å° add c.py Typo ä¿®æ¹çº add c.py
輸å
¥ :wq
ä¹å¾ï¼å ENTER ( 宿 )
æååç¨ log 確èªä¸ä¸( å¦ä¸å )ï¼çç¢ºä¿®æ¹æåäºï¼æåå°è¨æ¯ä¿®æ¹çº add c.pyï¼
ééæåå°æ¹è¦å大家æä¸ä¸ï¼å°±æ¯ commit id ææ¹è®ï¼æææ¹è®çå°æ¹æ¡åºä¾çµ¦åä½çï¼
ä¿®æ¹å
ä¿®æ¹å¾
ç°¡å®ä¾èªªï¼å°±æ¯ç®å commit id ä¹å¾ç commit id 齿æ¹è® ( æé»ç¹å£ :sweat_smile: )
ééè£å ä¸ä¸ï¼åªè¦ä½ ç¨äº rebaseï¼å°±æçå°é¡ä¼¼ä¸é¢çåï¼
origin/master å°±æ¯æé 端 ( romote ) ç repoï¼å®æ¯åä½ èªªä½ ç¾å¨ç repo å·²ç¶å origin/master
ä¸ä¸æ¨£äºï¼æä»¥ï¼éæåä½ å¦æè¦ pushï¼è«ä½¿ç¨ git push --force-with-lease
ã
ééå¯è½æäººæåï¼å¦ææå¸æä¿®æ¹ç¬¬ä¸å commit 該æéº¼è¾¦ :question:
éæåå¯ä»¥ä½¿ç¨ï¼
git rebase -i --root
edit
Youtube Tutorial - git rebase interactive - edit - PART 2
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
以ä¸çºå®æ¹ç說æ
By replacing the command "pick" with the command "edit", you can tell git rebase to stop after applying that commit, so that you can edit the files and/or the commit message, amend the commit, and continue rebasing.
ç°¡å®èªªï¼reword åªå¯ä»¥ä¿®æ¹ commit messageï¼è edit ä¸åªå¯ä»¥ä¿®æ¹ commit message ï¼éå¯ä»¥ä¿®æ¹ files å §å®¹ã
å ä¾ççä¸é¢éå¼µå
éå徿顝 add a.py -> add b.py -> add c.py -> add d.py ï¼ç¾å¨ææ³å¨ add c.py å add d.py ä¸åå ä¸åæ±è¥¿ï¼
ä¹å°±æ¯è®æ add a.py -> add b.py -> add c.py -> add c1.py -> add d.py 鿍£ã
å¢å ä¸å add c1.py çæ å¢æå°±å¯ä»¥ä½¿ç¨ edit äºï¼( 以䏿就ä¸èªªé£éº¼è©³ç´°äºï¼æç´æ¥è¬éé» )ï¼
å å·è¡ä»¥ä¸æä»¤ ( æåçç®æ¨æ¯ a7ed6ff ï¼æä»¥é¸ä»çä¸ä¸å commit idï¼ä¹å°±æ¯ f0a761d )
git rebase -i f0a761d
鿬¡æåå° pick ä¿®æ¹æ e ææ¯ edit ( å¦ä¸å )
ç¶ä½ æä¸ ENTER ä¹å¾ï¼ä½ æçå°ä¸åï¼
A çé¨ä»½æ¯å¯ä»¥ä¿®æ¹ commit messageï¼
B çé¨ä»½åæ¯åä½ èªªç¶ä½ ä¿®æ¹ ( 滿足 ) å®ç¢ï¼å¯ä»¥å·è¡ git rebase --continue
ï¼
A çé¨ä»½æåä¸åäºï¼ä½æåç¾å¨ä¾å å·¥å§ ( å¢å c1.py )ï¼
é¦å
ï¼æå建ç«ä¸å c1.py æªæ¡ï¼ç¶å¾ git add c1.py
ï¼æ¥è commit ä» ( å¦ä¸å )
ååæèªªéäºï¼ç¶ä½ 滿足æï¼å¯å·è¡ git rebase --continue
ï¼æ¶å·¥
åç¨ log 確èªä¸ä¸ï¼å¤ªç¥äº :satisfied: æåå ä¸å»äº
squash
Youtube Tutorial - git rebase interactive - squash fixup - PART 3
# Commands:
# p, pick = use commit
# s, squash = use commit, but meld into previous commit
以ä¸çºå®æ¹ç說æ
The suggested commit message for the folded commit is the concatenation of the commit messages of the first commit and of those with the "squash" command,
ç°¡å®èªªï¼ä½ 妿æ³è¦å°å¤å commit åä½µæä¸åï¼ä½¿ç¨ squash å°±å°äºï¼( 以䏿就ä¸èªªé£éº¼è©³ç´°äºï¼æç´æ¥è¬éé» )ï¼
鿬¡çç®æ¨æ¯è¦å° commit id fc45824 以å commit id a7ed6ff åä½µèµ·ä¾ ( å¦ä¸å )
å å·è¡ä»¥ä¸æä»¤
git rebase -i f0a761d
æ¥èä½ æçå°ä¸åï¼æåå° fc45824 éå cmmit ç pick ä¿®æ¹æ s æ squash
( 仿åä½µä»çåä¸åï¼ä¹å°±æ¯ a7ed6ff )
( å¦æä½ è¦åä½µå¤å commitï¼å°±å¤å齿¹æ s æ squash, 注æ, æé åºæ§ :exclamation: :exclamation: )
å°èæä¸ ENTERï¼æçå°ä¸å
éæåä»å·²ç¶åä½µäºéå ©å commitï¼æåå°±å¯ä»¥è¼¸å ¥æ°ç commit messageï¼
ééæåè¼¸å ¥ add c.py and c1.py
åæ ENTER ( æå )
å¯ä»¥åç¨ log 確èªä¸ä¸ï¼æåæåå°å ©å commit åä½µäº
c.py 以å c1.py é½åå¨ï¼ä»£è¡¨æåæåäº :satisfied:
fixup
Youtube Tutorial - git rebase interactive - squash fixup - PART 3
# Commands:
# p, pick = use commit
# f, fixup = like "squash", but discard this commit's log message
以ä¸çºå®æ¹ç說æ
omits the commit messages of commits with the "fixup" command.
å ¶å¯¦éåå squash å¾åï¼é叏妿æåè¦å¿½ç¥ä¸å commit message ä½ä¿ç commit çå §å®¹ï¼æåå°±æä½¿ç¨ fixupï¼
ç®æ¨ï¼ééæåæ³è¦ç§»é¤ fc45824 çå commit ( ä½ä¿ç commit çå §å®¹ )
å å·è¡ä»¥ä¸æä»¤
git rebase -i f0a761d
å° fc45824 ç pick ä¿®æ¹æ f æ fixup ( å¦ä¸å )
( ä»æç§»é¤ fc45824 éå commit message ï¼ä½ä¿ç commit çå §å®¹ )
æ¥è ENTERï¼æå rebase
å¯ä»¥åç¨ log 確èªä¸ä¸ï¼æå忽ç¥äº add c1.py éå commit
使¯ c.py 以å c1.py é½åå¨ ( åªå¿½ç¥ commit message )ï¼
çå°é裡ï¼å¤§å®¶å ¶å¯¦å¯ä»¥æ³ä¸æ³ squash å fixup ççé常é¡ä¼¼ï¼
åªä¸é squash å¯ä»¥ä¿®æ¹ commit messageã
ç°¡å®ä¸é»ï¼å®ç´æ³è¦å¿½ç¥æä¸å commit message æï¼ä½¿ç¨ fixupï¼
æ³è¦åä½µ commit ä¸¦ä¿®æ¹ commit message æï¼ä½¿ç¨ squashã
exec
Youtube Tutorial - git rebase interactive - exec drop - PART 4
# Commands:
# p, pick = use commit
# x, exec = run command (the rest of the line) using shell
以ä¸çºå®æ¹ç說æ
You may want to check that your history editing did not break anything by running a test, or at least recompiling at intermediate points in history by using the "exec" command (shortcut "x")
éååè½ææ¯è¼å°ç¨ï¼ä½éæ¯èªªä¸ä¸ï¼ç°¡å®èªªï¼å°±æ¯ä»å¯ä»¥ç¨ä¾ check ä½ ç
rebase æ¹åæ¯ä¸æ¯å½±é¿å°æ´é« ( ç¨ exec command ç¢ºèª )ã
è½ä¸å¤ªæ :question: æ²éä¿ï¼å妿ä»å¤©åäºä¸å¤§å ç rabase æ´åï¼ä½ææ³ç¢ºèªæé樣åäºä¹å¾ï¼
å°æ´é«æ¯ä¸æ¯æå½±é¿ï¼ä¹å°±æ¯å¯ä»¥å¨æ´åæï¼é 便è·ä½ ç test å»ç¢ºèªæ´é«æ¯æ£å¸¸ workã
鿝è½ä¸æ :question: 乿²éä¿ï¼æç¨ä¸åç¯ä¾çµ¦å¤§å®¶ç
å¦ä¸åï¼å妿æ³è¦å¨ææ´åä¸åä¸äº test å»ç¢ºä¿æçæ´åä¸æå½±é¿æ´é«ï¼
( éç¶éé齿¯ pickï¼ä¹å°±æ¯æ²æ¹åï¼ä½æ¹ä¾¿èªªæï¼å¤§å®¶è«èªè¡æ³åææ¹å :sweat_smile: )
A çé¨ä»½ echo "test sucess" éåèªç¶ä¸ç¨æåé¡ï¼
使¯ B çé¨åå°±æåºåé¡ï¼å çºæ ¹æ¬æ²æ error éåæä»¤ï¼
ç¶å¦æå·è¡å° shell æé¯èª¤æï¼ä»æåä¸ä¾ï¼è®ä½ ä¿®æ£ï¼
å¦ä¸åï¼æååå¨äº add c.py éå commit ä¸ï¼å çºæ¥ä¸ä¾å¾ test error äº
éæåæåå¯ä»¥ä¿®æ£åé¡ï¼ä¿®æ£å®äºä¹å¾ï¼åå·è¡ git rebase --continue
ã
éååè½ææ³æè©²æ¯è®ä½ å»éä¿®æ¹éè·ä½ èªå·±ç testï¼ç¢ºä¿æ¹å齿£å¸¸ã
drop
Youtube Tutorial - git rebase interactive - exec drop - PART 4
# Commands:
# p, pick = use commit
# d, drop = remove commit
以ä¸çºå®æ¹ç說æ
To drop a commit, replace the command "pick" with "drop", or just delete the matching line.
éå就簡å®å¤äºï¼ç§»é¤éå commit ( å å« commit å §å®¹ )ï¼
åè¨æåç log å¦ä¸ï¼
鿬¡çç®æ¨æ¯ç§»é¤ f0a761d å 980bd9a å 1539219 éäº commitï¼
å å·è¡ä»¥ä¸æä»¤
git rebase -i 8f13aaa
å° pick ä¿®æ¹æ d æ drop ( å¦ä¸å )
æ ENTER ä¹å¾ï¼åç¨ log 確èªä¸ä¸ï¼
å¾ä¸åå¯ä»¥ç¼ç¾ï¼æåå·²ç¶æåçç§»é¤ f0a761d å 980bd9a å 1539219 éäº commitï¼
並ä¸ä¹çå° commit å §å®¹ä¹é½è¢«ç§»é¤äºï¼åªå©ä¸ a.py èå·²ã
git pull è£å
æ¢ç¶ä»ç´¹å®äº git fetch
以å git rebase
ä¹å¾ï¼æ¥ä¸ä¾æè¦åè£å
ä¸äº git pull
é¡å¤ç options 忏
git pull [<options>] [<repository> [<refspec>â¦â]]
æ´å¤è©³ç´°æä»¤å¯åè https://git-scm.com/docs/git-pull#_optionsã
éè£¡ç°¡å®æ´çä¸ä¸ï¼
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase
å¨ git-rebase ä¸å·²ç¶è®å¤§å®¶äºè§£å°ä½¿ç¨ git-rebase å¯ä»¥è® code review ç人
çèµ·ä¾æ¯è¼èæï¼æä»¥å°±ä½¿ç¨ git pull --rebase
å§ ( åææ¯ä½ è¦ç¥éä½ å¨å¹¹å :smile: )ã
ééææ¨¡æ¬ git pull
以å git pull --rebase
çå·®ç°ï¼é 便å ä¸è¡çªçæ
æ³ï¼å çºæ¥é©è »å¤çï¼
æä»¥å¦æä½ æ³äºè§£æ´å¤ä»çæ¦å¿µï¼è«åèä»¥ä¸ææææå¸ï¼
Youtube Tutorial - git pull vs git pull --rebase
ä½¿ç¨ git pull
å¾ççµæï¼code review ç人ä¸å®ç¿»æ¡ ( å¦ä¸å ) :triumph:
ééææé 便模æ¬è¡çªçæåï¼ä½ æç¼ç¾å¦æä½¿ç¨ git pull
æå¤ä¸å commit (ä¹å°±æ¯ä¸æ¹ç "fix conflict")ã
ä½¿ç¨ git pull --rebase
å¾ççµæï¼code review ç人表示溫馨 ( å¦ä¸å ) :innocent:
ééææé 便模æ¬è¡çªçæåï¼ä½ æç¼ç¾å¦æä½¿ç¨ git pull --rebase
䏦䏿ååå䏿¨£å¤äºä¸å commitï¼
åå æ¯å çºç¶æåä½¿ç¨ git pull --rebase
é æè¡çªæï¼ä¿®å¥½è¡çªçå
§å®¹ä¹å¾ï¼git add xxxxï¼æ¥èæåæ
ç´æ¥å·è¡ git rebase --continue
ã
åè¨ä»å¤©ä½ å·è¡äº git pull --rebase
ä¹å¾ï¼ç¼ç¾å¾é£å :fearful:ï¼æ³è¦åæ¶ï¼
ç´æ¥å·è¡ git rebase --abort
å³å¯åå°ä¹åççæ
ã
é¡å¤è£å å°æå·§,
說æ --autostash
,
ä¸è¬ä¾èªª, 妿æåå·¥ä½å°ä¸å, çªç¶æ³è¦ç´æ¥ git pull --rebase
, å䏿³ commit,
æµç¨å¤§ç´æåä¸é¢é樣
git stash # å°ç®åçæ¹ååé²å» stash ä¸
git pull --rebase
git stash pop # å°ä¹åçæ¹åå¾ stash ä¸ pop åºä¾
# 妿æè¡çªåå»è§£æ±ºè¡çª
ä½å¦ææ¯æ¬¡é½è¦å·è¡ééº¼å¤æä»¤å ¶å¯¦ææé»ç © :sweat:
ä½å¯ä»¥ééä¸å忏ä¾è§£æ±º, ä¹å°±æ¯
git pull --rebase --autostash
以ä¸é段æä»¤åºæ¬ä¸å°±æ¯å¹«ä½ å·è¡äºååä¸é¢é£ä¸ä¸²çæ±è¥¿,
妿æè¡çª, å°±åä¿®æ£è¡çªå³å¯ :smile:
git-cherry-pick
çå½±çææ´æ¸ æ¥ï¼æææå¸¶å¤§å®¶åæå Youtube Tutorial - git-cherry-pick
git-cherry-pick éåæä»¤å¤§å®¶å¯è½ææ¯è¼éç :confused:
æ²éä¿ï¼æåå ä¾ç 宿¹ ç說æ
git-cherry-pick - Apply the changes introduced by some existing commits
çå®å®æ¹èªªæéæ¯ :question: :question: :question:
æ²éä¿ï¼æä¾åè¨ä¸åæ å¢ ( çè§£å®å®ä½ å°±äºè§£äº git-cherry-pick çç¨éäº )ï¼
åè¨ç¾å¨ master 忝ç log å¦ä¸å
ç¶å¾æä¸å v1 ç忝 log å¦ä¸å
ç¾å¨æå¸æ merge v1 忝ä¸ç 14dee93 - add d.py éå commit
( å çº 14dee93 éå commit 實å¨å¤ªæ£äºææ¯å çºæäºåå åªéè¦éå commit )
éå°ä¸è¿°éç¨®æ æ³ï¼å°±å¾é©åä½¿ç¨ git-cherry-pickï¼ä¹å°±æ¯èªªææ³è¦å ¶ä»åæ¯ä¸çæå¹¾å commit èå·²ï¼
ä¸éè¦å ¨é¨ï¼æå¥è©±èªªï¼å°±æ¯æ¿å ¶ä»åæ¯ä¸ç commit éä¾ä½¿ç¨ã
äºè§£äºé©åçä½¿ç¨æ å¢ï¼æ¥ä¸ä¾æåå°±ä¾å¯¦æ° :smirk:
é¦å ï¼ææ³è¦ v1 忝ä¸ç 14dee93 - add d.py éå commitï¼
æä»¥æå åå° master åæ¯ï¼æ¥èå·è¡
git cherry-pick 14dee93
å¦æä½ æ³è¦ä¸æ¬¡æ¿å¾å¤ç忝éä¾ä¹æ¯å¯ä»¥ï¼ç´æ¥ä½¿ç¨ç©ºç½ééå³å¯
git cherry-pick 14dee93 xxxxxx xxxxxx xxxxxx xxxxx
å¦æä½ æ³ä¸æ¬¡æ¿ä¸ååéç commits, å¯ä»¥ä½¿ç¨ä»¥ä¸çæä»¤
git cherry-pick A^..B
(A å B ä»£è¡¨ä½ ç commits id)
å¦ææ²æè¡çªï¼å°±æçå°å¦ä¸å
åè§çä¸ä¸ master ç log
ä½ æç¼ç¾æåæåæ v1 忝ä¸ç 14dee93 - add d.py éå commit æ¿éä¾
使ç¨äºï¼ä½ç¾å¨å®ç commit id 廿¯ ab70429ï¼é忝æ£å¸¸çï¼å çºå®éè¦
éæ°æ°è¨ç® :smile:
å ¶å¯¦ï¼ä½ æç¼ç¾ git-cherry-pick æ²ææ³åä¸çå°é£ :satisfied:
å¨ cherry-pick æï¼é£å æéå°è¡çªï¼ééæå°±åå¤åä¸åè¡çªçç¯ä¾ï¼
åè¨ master ç log å¦ä¸
v1 忝ä¸ç log å¦ä¸ï¼ææ³è¦å®ç 3a2f29a - add c.py and print world éå commit
v2 忝ä¸ç log å¦ä¸ï¼ææ³è¦å®ç 553587b - add f.py éå commit
æ¥ä¸ä¾æåå°±åå masterï¼ç¶å¾ cherry-pick éå ©å commitï¼
éæåä½ æç¼ç¾ï¼å®è¡çªäº :fearful:
ä½¿ç¨ git status
çä¸ä¸çæ
ï¼å
¶å¯¦ A çé¨åé½æä½ å¦ä½è§£è¡çªäº
é¦å
ï¼æåå
å° c.py ä¿®æ£å¾ï¼å·è¡ git add c.py
ï¼æ¥èåæç
§ A çé¨ä»½
å·è¡ git cherry-pick --continue
ï¼å°±æåæè·³åºä¸å編輯è¦çªï¼
輸å
¥å® commit message ä¹å¾ï¼å輸å
¥ wq
ï¼å°±æçå°ä¸å
æå¾ï¼åè§ç logï¼
æåæåå°æåè¦ç commit merge å°æåç master 忝ä¸äº :kissing_smiling_eyes:
æ³äºè§£æ´å¤çä½¿ç¨æ¹æ³ï¼å¯åè宿¹æä»¶ https://git-scm.com/docs/git-cherry-pickã
git revert
åè¨æ commit history çº A1 -> A2 -> A3 -> A4 -> A5 -> A6
æç¾å¨æ³è¦å A4 éå commit , éæåæå°±å¯ä»¥ä½¿ç¨ git revert ï¼ï¼
å revert A6
git revert A6
å revert A5
git revert A5
åå¦ä½ åçç¾å¨ç commit history , 仿é·çå鿍£
A1 -> A2 -> A3 -> A4 -> A5 -> A6 -> A6_revert -> A5_revert
éæåï¼å ¶å¯¦ä½ ç commit å°±æ¯å¨ A4 éåä½ç½® ã
ä½¿ç¨ git revert ç好èï¼å°±æ¯å¯ä»¥ä¿ç commit history, è¬ä¸ä½ å徿äºï¼
ä¹å¯ä»¥å¨ revert åå»ã
å¦æä½ æ³è¦ revert ææ°ç commit, åªéè¦ä½¿ç¨ HEAD
git revert HEAD
解決è¡çª
å¨é²è¡åä½µçæåï¼ææåæé¡¯ç¤ºåº è¡çªconflicts ï¼éæåå°±å¿ é æå解決è¡çªå¾åéåºã
é常æç®åæå®¹æéå°è¡çª conflicts ï¼å°±æ¯ä½¿ç¨ pull éåæä»¤çæå
ä»ç´°çéå¼µåï¼å¦æä½¿ç¨pulléåæä»¤ï¼æå¹«ä½ èªå merge ( å¦å裡ç Auto-merging Hello.py )ï¼
ç¶å¾æ¥èç CONFLICT ( content ) : Merge conflict in Hello.py ï¼å說 Automatic merge failedï¼
å°±æ¯åè¨´ä½ ï¼ Hello.py éåæªæ¡æè¡çªï¼ç¶å¾ä½ å¿ é æåä¸å»è§£æ±ºè¡çªã
git status å¯ä»¥å訴æåè¡çªçæä»¶ã
æéè¡çªæä»¶æåæçå° Git ç¨ <<<<<<<ï¼=======ï¼>>>>>>> æ¨è¨åºä¸å忝çå §å®¹ï¼æåä¿®æ¹å®ç¢å¾åæäº¤ï¼
é常æåææåä¸å»ä¿®æ¹è¡çª conflictsï¼ç¶å¾åå å commit
git add Hello.py
git commit -m "conflict fixed"
åè¨ä»å¤©æåæ³è¦æ¾æ£éå merge æå該æéº¼åå¢ ï¼
git merge --abort
æ
git reset --hard HEAD
å¯ä»¥åæ¶é次ç merge åå° merge åã
git stash æä»¤
å¾å¤æåï¼æåæ£å¨éç¼ä¸åæ°åè½åææ¯ debugï¼ç¶å¾çªç¶æä¸ååè½éè¦ç·æ¥ä¿®æ£ï¼
ä½ä½ å䏿³ commit ç¾å¨ççæ³ï¼å çºæ ¹æ¬æ²æç¾©ï¼äºæ åªåäºä¸åï¼éæå stash
éå實ç¨çæä»¤å°±æ´¾ä¸ç¨å ´äºã
èåä¾åï¼åè¨æåæ¹äº A.py å B.py éå ©åæªæ¡
ç¶å¾ï¼ç¾å¨çªç¶æä¸å bug å¿ é 馬ä¸(ç«å»)èçï¼
使¯ï¼åææä¸çäºæ éæ²åå®é¿~~~~
éæåï¼å¯ä»¥å©ç¨ä»¥ä¸æä»¤
git stash
åå¦ä½ æ³è¦æ´æ¸ æ¥èªå·±é次ç stash åå æ¯ä»éº¼ï¼ææ¯éæ¯æ£å¨éç¼ä»éº¼åè½ å¯ä»¥ä½¿ç¨ä»¥ä¸æä»¤
ç¯ä¾, é è¨åªæå å
¥å·²ç¶è¿½è¹¤ç, ä¹å°±æ¯è¦å
å·è¡ git add .
# èèªæ³
git stash save "ææ¯è¨»è§£"
# æ°èªæ³
git stash -m "ææ¯è¨»è§£"
å¦æä½ æ³ææ²è¿½è¹¤çä¹å å
¥é²å», 使ç¨ä»¥ä¸èªæ³, 鿍£å°±ä¸ç¨å·è¡ git add .
äº
# èèªæ³
git stash save -u "feature"
# æ°èªæ³
git stash -u -m "feature"
åæ¸èªªæ
-u
| --include-untracked
-a
| --all
æ¥ä¸ä¾ä½ å¯ä»¥ä½¿ç¨ status æä»¤ï¼ä½ æç¼ç¾è®ä¹¾æ·¨äº
並ä¸å¯ä»¥ä½¿ç¨ä¸åçæä»¤ä¾è§ç stash 裡é¢çæ±è¥¿
git stash list
ç¶å¾ä½ å¾åªåå°è§£æ±ºéå bugï¼commit å®ä¹å¾ï¼ å¯ä»¥å使ç¨ä¸åçæä»¤æ stash ååä¾ï¼éæä»¤ååå¾ä¹æåªé¤ stash
git stash pop
åè¨ä»å¤©ä½ æå¾å¤ç stashï¼ä½ å¯ä»¥æå®ï¼å¦ä¸ (é¸èªå·±åæ¡çç¨æ³)
git stash pop 0
git stash pop stash@{0}
ä½ æç¼ç¾ååçæ±è¥¿åä¾äº~
å¦æä½ å¸æä½¿ç¨ stash ååä¹å¾ï¼ä¸å¸æåªé¤ stash ï¼å¯ä»¥ä½¿ç¨ä¸åçæä»¤
git stash apply
å¦ä¸åï¼ä½ å¯ä»¥ç¼ç¾ååå¾ï¼ stash ä¸¦æ²æè¢«åªé¤
å¦æä½ åªæ¯æ³è¦åªé¤æ«åï¼å¯ä»¥ä½¿ç¨ä¸åçæä»¤
git stash clear
å¾ä¸åå¯ä»¥ç¼ç¾ï¼stash 裡é¢çæ±è¥¿è¢«æååªé¤äº
å¦æä½ æ³ä¸æ£æå®ç stashï¼å¯ä»¥ä½¿ç¨ (é¸èªå·±åæ¡çç¨æ³)
git stash drop 0
git stash drop stash@{0}
git worktree æä»¤
(æä»ç´¹éåçåå æ¯å çºçäºä¸ä¸ claude code çæ±è¥¿, ç¼ç¾è£¡é¢æä½¿ç¨å°éåæä»¤)
éåçæ¦å¿µæ¯é¡ä¼¼è¤è£½(使¬è³ªä¸æ¯è¤è£½)ä¸åå ¨æ°ä¹¾æ·¨çå°æ¡åºä¾, åªé»æ¯å¯ä»¥ä¸å½±é¿åæ¬çè³æå¤¾,
å¦æä½ ç忝æ¯è¦åçæ¬åç´, è »é©åä½¿ç¨ worktree ä¾èçç.
ç°¡å®èªªæ¯ 空ééé¢ çæ¦å¿µ.
åå¦ç¾å¨ä½ æä¸åå°æ¡åç¨±æ¯ repo, è·¯å¾æ¯
cd /home/twtrubiks/demo/repo
ç®åç main åæ¯çæ³
git log
* 62f3d61 - (HEAD -> main) first commit
ç¶å¾ç¾å¨éç¼äºä¸ååè½, 建ç«äºä¸å feature_1 忝
git switch -c feature_1
éç¼å°ä¸å, ç®å feature_1 ççæ³å¦ä¸, éæ²éç¼å® step_2 寫å°ä¸åä¹ä¸æ³è¦ commit
⯠git status
On branch feature_1
Untracked files:
feature1.py
git log
* d716943 - (HEAD -> feature_1) step_1 (1 second ago)
* 62f3d61 - (main) first commit (5 minutes ago)
çªç¶æä¸åéæ±éè¦ hotfix,
éæå妿ä¸ä½¿ç¨ git stash
, æ¹ä½¿ç¨ git worktree
çæ¹å¼,
é¦å , å¾ main 忝éä¸å worktree åºä¾, å·è¡åºä¸ç code
git worktree add ../repo-hotfix main
å¨ä¸å±¤ç®éä½ æç¼ç¾, å¤äºä¸å repo-hotfix è³æå¤¾, å®è£¡é¢æ¯ main ç忝,
å¦æä½ å°éåè³æå¤¾åºä¸è§ç, ä½ æç¼ç¾ .git
(鿝ä¸åæªæ¡ï¼è䏿¯è³æå¤¾),
裡é¢åªæä¸è¡æåï¼å¦ä¸
cat .git
gitdir: /home/twtrubiks/demo/repo/.git/worktrees/repo-hotfix
éæåä½ å°±å¯ä»¥é²å» /home/twtrubiks/demo/repo-hotfix
ç¶å¾ä¾ç §åéçæµç¨åéä¸å忝,
git switch -c hotfix-1
æ¥èå¯ä»¥ä½¿ç¨ git worktree list
è§ç
⯠git worktree list
/home/twtrubiks/demo/repo [feature_1]
/home/twtrubiks/demo/repo-hotfix [hotfix-1]
éè£¡é¢æ¯å®å ¨ç¨ç«èä¸å repo è³æå¤¾éé¢ç,
(é裡å¯ä»¥è¨å®ä½ éè¦å¨éå忝ççæ¬, ä¾å¦éå忝å¯è½æ¯ä½¿ç¨ python 3.13)
ç¶å¾ä½ å¨éè£¡é¢æä½ çåè½éç¼å®ç¢, ç¶å¾ push ä¸å»è· PRæµç¨é樣, å°ééçµæ.
ä½ å¯ä»¥åå° repo å°æ¡åºä¸ç¹¼çºéç¼, ååçå·¥ä½çæ å 嫿ªè¿½è¹¤çæªæ¡é½åå°ä¸åçå¨é£é.
å¦æç¢ºå®ä¸éè¦éå worktree, 使ç¨åºä¸çæä»¤åªé¤å³å¯.
git worktree remove ../repo-hotfix
æé, å¦æä½ æ²ææ¸ é¤ worktree 忝, ä½ æ¯ç¡æ³åæéå»å°æç忝, åééçä¾å, ä½ æç¡æ³åæéå» main 忝.
å¦æä½ æå¿ä¸å°å¿åªæä½ ç worktree, å¯ä»¥ä½¿ç¨ lock
git worktree lock ../repo-hotfix
鿍£ç¶ä½ ççä¸å°å¿å·è¡è¦åªæä½ ç worktree, æè¦åä½ è¦å ä¸ -f -f
æè½åªé¤
git worktree remove -f -f ../repo-hotfix
æç¥éæå¾ä½ ä¸å®æ³å, 鿍£åæè¤è£½ä¸åè³æå¤¾åºä¾, ç¶å¾å¨è³æå¤¾ä¸åæåæ¯æä»éº¼å·®å¥
詳細æ¯è¼å¯åèä¸è¡¨
ç¹æ§ | git worktree | è¤è£½è³æå¤¾ (cp -r ) |
---|---|---|
æ ¸å¿æ©å¶ | é£çµ (Linked) | è¤è£½ (Copied) |
.git è³æåº« | 1 å (å ±äº«) | 2 å (ç¨ç«ä¸äºä¸ç¸å¹²) |
Commit 忥 | 峿èªå忥 å¨ä»»ä½ä¸å worktree ä¸ commitï¼å¦ä¸åç«å»å°±è½çå°ã | å®å
¨ä¸åæ¥ å¿ é æåè¨å®, éé fetch /pull 忥ã |
硬ç¢ç©ºéä½¿ç¨ | 髿ç åªå¢å 工使ªæ¡ç空éï¼é¾å¤§ç .git/objects æ·å²ç´éä¸éè¤è£½ã | 極度浪費 宿´è¤è£½äºæ´å .git è³æåº«ï¼å°æ¡æ·å²è¶é·ï¼æµªè²»ç©ºéè¶å¤ã |
æä½æµç¨ | ç°¡å®åªé
git worktree add/remove | è¤éä¸éåç´è¦º éè¦è¨å®æ¬å°é¡å¤è¨å®ä»¥åæ¨å°remote |
é¢¨éª | ä½ æ°¸é åªæä¸åäºå¯¦ä¾æº (Single Source of Truth)ï¼ä¸æææ··æ·å²ã | é« å®¹æç¢çæ··æ·ï¼çè³å°è´å ©åç¨ç«çæ·å²ç´é**åå² (diverge)**ã |
git tag
Youtube Tutorial - git tag æå¸
æ¥ç tag
git tag
æå®ééµå
git tag -l "v1.*"
-l
--list
git tag æ è¼éç´æ¨ç±¤(lightweight tag) å é註æ¨ç±¤(annotated tag).
è¼éç´æ¨ç±¤(lightweight tag)
妿æ³è¦å»ºç«ä¸åè¼éç´çæ¨ç±¤ï¼è«ä¸è¦æå® -a
-s
(GPG-signed) -m
git tag tag_name [commit_id]
妿åªä½¿ç¨ git tag tag_name
, èæ²å ä¸å¾é¢ Commit id,
åæèªåæ tag æ¾å¨ç®åçéå Commit id ä¸.
顯示註解
git show v1.1-light
é註æ¨ç±¤(annotated tag)
git tag -a v1.1 -m "version 1.1"
-a
å°±æ¯æ¨ç±¤å稱 --annotate
-m
代表該æ¨ç±¤èªªæ(註解)
卿å®ç commit ä¸è¨ tag
git tag -a v1.2 -m "version 1.1" [commit_id]
顯示註解
git show v1.1
è¼éç´æ¨ç±¤(lightweight tag) å é註æ¨ç±¤(annotated tag) çå·®å¥å°±æ¯æ¯å¦è½çå°æ´å¤çç´°ç¯,
é註æ¨ç±¤(annotated tag) å¤äºæ´å¤çè³è¨.
è¼éç´æ¨ç±¤(lightweight tag) å¦ä¸
é註æ¨ç±¤(annotated tag) å¦ä¸
ç¶ä½ å·è¡ git push
é è¨æ¯ä¸æå° tag æ¨å° remote.
éè¦å·è¡ä»¥ä¸çæä»¤, push tag å° remote 端
git push origin [tagname]
䏿¬¡ push å¾å¤ tags (å°ææä½ å ¨é¨ä¸å¨ remote 端ç tag é½ push ä¸å».)
git push origin --tags
ç¶å
¶ä»äººå·è¡ git clone
æ git fetch
å°±å¯ä»¥æ¿å°éäº tags.
ç§»é¤æ¬å° tag
git tag -d [tagname]
åªé¤ remote tag
git push --delete origin [tagname]
git show
ä¸è¬ä¾èªªï¼æåªç¨ä»ä¾çéå commit ä¿®æ¹äºåªäºæ±è¥¿
git show <commit ID>
git show [<options>] [<object>â¦â]
å ¶ä»æ´è©³ç´°çä»ç´¹ï¼è«åè https://git-scm.com/docs/git-show
git diff
以ä¸çºå®æ¹èªªæ
Show changes between commits, commit and working tree, etc
ééèå¹¾åä¾åï¼
æªæ¡éæ²é²å ¥æ«åå ( Stage )ï¼ä¹å°±æ¯å·è¡ git add xxx ä¹åï¼
å¯ä»¥çåäºé£äºä¿®æ¹ï¼
ä¹å¯ä»¥ç commits ä¹éçå·®ç°
å ¶ä»æ´è©³ç´°çä»ç´¹ï¼è«åè https://git-scm.com/docs/git-diff
git diff-tree
git-diff-tree - Compares the content and mode of blobs found via two tree objects
æ¯è¼å ©å blob (commit) çå·®ç°.
æä»¶å¯åè git-diff-tree
ç´æ¥çç¯ä¾
git diff-tree -r --no-commit-id --name-status -a --diff-filter=ACDMRT <å
¶ä¸ä¸åcommit id> <è¦æ¯è¼çcommit-id> > changes.txt
-r
代表 Recurse into sub-trees.
--no-commit-id
This flag suppressed the commit ID output.
--name-status
Show only the name(s) and status of each changed file.
--text
-a
Treat all files as text.
--diff-filter=[(A|C|D|M|R|T|U|X|B)â¦â[*]]
Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R),
have their type (i.e. regular file, symlink, submodule, â¦â)
changed (T), are Unmerged (U), are Unknown (X),
or have had their pairing Broken (B).
å·è¡å¾æé change.txt æçå°å·®ç°çæªæ¡å稱.
M addons/account/i18n/account.pot
M addons/account/i18n/ar.po
M addons/account/i18n/az.po
M addons/account/i18n/be.po
M addons/account/i18n/bg.po
M addons/account/i18n/ca.po
M addons/account/i18n/cs.po
......
git archive
å»¶çºä¸é¢çä¾å, 妿æ³è¦æå ä¸åç commit ä¹éçå·®ç°æªæ¡ (䏿³è¦æ´å å¯åº, å çºå¤ªå¤§äº, åªæ³æ¾åºå·®ç°æªæ¡),
éæåå¯ä»¥æé archive æä»¤, ç¯ä¾å¦ä¸
git archive --format=zip --output=files-diff.zip HEAD $(git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT <å
¶ä¸ä¸åcommit id> <è¦æ¯è¼çcommit-id>)
鿍£å¯åºä¾ç zip, å°±æ¯éå ©å commit ä¹éå·®ç°ç宿´æªæ¡.
git grep
以ä¸çºå®æ¹èªªæ
git-grep - Print lines matching a pattern
ç°¡å®èªªï¼å°±æ¯å¯ä»¥å¹«ä½ æ¾åºç¬¦åç patternï¼èåä¾åï¼æå¸ææ¾åºå §å®¹
æå å« hello éå pattern çæªæ¡ï¼éæåï¼å°±å¯ä»¥å·è¡ä»¥ä¸æä»¤
git grep "hello"
æé¡¯ç¤ºåºè©² pattern å¨åæªæ¡ä»¥ååªæ®µç¨å¼ç¢¼æç¨å°ã
å ¶ä»æ´è©³ç´°çä»ç´¹ï¼è«åè https://git-scm.com/docs/git-grep
git clean
åªé¤æªè¢«è¿½è¹¤çæªæ¡,
git clean -n -d
-n, --dry-run
模æ¬å·è¡ Donât actually remove anything, just show what would be done
-d
代表 recurse, è³æå¤¾ä¹æåªé¤.
éåæå®æ¯åè¨´ä½ æåªé¤åªäºè³æ, 䏿ççåªé¤.
ç¯ä¾å¦ä¸,
⯠git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
test.py
nothing added to commit but untracked files present (use "git add" to track)
⯠git clean -n -d
Would remove test.py
å¦æä½ å·è¡ä»¥ä¸çæä»¤, å°±æççåªé¤,
git clean -df
詳細說æå¯ä½¿ç¨ git clean --help
è§ç,
ç¯ä¾å¦ä¸,
⯠git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
test.py
nothing added to commit but untracked files present (use "git add" to track)
⯠git clean -df
Removing test.py
⯠git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
éè¨å¾åé¢ä»ç´¹ç git reset
æä»¤å, åºæ¬ä¸å®å¯ä»¥æé
git clean
ä¸èµ·ä½¿ç¨,
git clean
å½±é¿æ²æè¢« track çæªæ¡
git reset
å½±é¿æè¢« track çæªæ¡
çµå以ä¸, å¯ä»¥åå°ä¸åæå®ç commit 乾淨ççæ ,
git reset --hard HEAD
git clean -df
git status
建è°å¤§å®¶èªå·±æä½ä¸ä¸.
git Submodule
ç±æ¼éåå §å®¹ç¨å¾®æ¯è¼å¤ï¼æä»¥æå¦å¤å¯«äºä¸ç¯ï¼
-
Youtube Tutorial PART 1 - git Submodule tutorial - how to create submodule
-
Youtube Tutorial PART 2 - git Submodule tutorial - how to update submodule
-
Youtube Tutorial PART 3 - git Submodule tutorial - how to clone submodule
-
Youtube Tutorial PART 4 - git Submodule tutorial - how to remove submodule
git Subtree
ç±æ¼éåå §å®¹ç¨å¾®æ¯è¼å¤ï¼æä»¥æå¦å¤å¯«äºä¸ç¯ï¼
-
Youtube Tutorial PART 1 - git subtree tutorial - how to create subtree
-
Youtube Tutorial PART 2 - git subtree tutorial - how to push subtree
-
Youtube Tutorial PART 3 - git subtree tutorial - how to pull/create subtree
git å ¶ä»è¨å®
æåå·²ç¶è¨å®äº user.name 以å user.email ï¼ä½ Git ä¸å ¶å¯¦éæå¾å¤å¯è¨å®çæ±è¥¿
ææåï¼æåå¿ é ææäºæªæ¡ ( æä»¶å¤¾ ) æ¾å° Git å·¥ä½ç®éä¸ï¼ä½åä¸è½æäº¤å®åï¼
忝å¯ç¢¼è¨å®ææ¯ç·¨è¯å¨ IDE ç¢çåºä¾çæ±è¥¿ä¹é¡çï¼
æ¯æ¬¡ git status 齿çå°ç´ ç´ ç Untracked files ï¼é常æè¦ºå¾æé»ç ©......
éåé¡ Git ä¹å¹«æåæ³éï¼åªè¦å¨ Git å·¥ä½åçæ ¹ç®é䏿°å»ºä¸åç¹æ®ç .gitignore æä»¶ ï¼
ç¶å¾æè¦å¿½ç¥çæä»¶ ( æªæ¡ ) åç¨±è¼¸å ¥é²å»ï¼ Git å°±æèªå忽ç¥éäºæä»¶ã
ç¶ç¶ä¸éè¦èªå·±å¾é 寫 .gitignore æä»¶ï¼ GitHub å·²ç¶å¹«æåæºåäºä¸äºæä»¶ gitignore
.gitignore æªæ¡ç´æ¥æ¾å¨ç®éåºä¸å³å¯
.gitignore æªæ¡æ ¼å¼ç¯ä¾
.gitignore (Temporarily and Permanently)
主è¦å æ«æ(Temporarily) å æ°¸ä¹ (Permanently) çignoreï¼
- Temporarily ignore
é©å使ç¨å¨ settings çæªæ¡ï¼ææåæåå¨éç¼çæåï¼é½ææèªå·±çè¨å®ï¼
ä½éåè¨å®æªå¿ æ¯å¤§å®¶é½éè¦çï¼éæåå°±å¯ä»¥æ«æå 忽ç¥éåæªæ¡çæ¹è®ã
æ«æå¿½ç¥æåæªæ¡
git update-index --skip-worktree <file>
æ¢å¾©(Resume)æ«æå¿½ç¥æåæªæ¡
git update-index --no-skip-worktree <file>
- Permanently ignore
ééè£å ä¸åæ å¢ï¼åè¨ä»å¤© file éåæªæ¡å·²ç¶è¢« commit å° git ä¸äºï¼
使¯ææ³æä»å å ¥ .gitignoreï¼é樣該æéº¼è¾¦ :question:
å¦æä½ å¨ .gitignore ä¸å å ¥ fileï¼ä½ æç¼ç¾éæ¯æ²æè¢« ignore :confused:
éæåï¼æ£ç¢ºçåæ³æè©²æ¯è¦å å·è¡å·²ä¸æä»¤ï¼
git rm --cached <file>
å·è¡å®å¾å commit å³å¯ ( æªæ¡ä¸æå¾ç³»çµ±ä¸åªé¤ï¼åªæ¯è¦æ´æ° git ç index èå·² )
éæåå¯ä»¥ååè©¦æ´æ° file çå §å®¹ï¼ä½ æç¼ç¾å®æå被 ignore äº :smile:
git alias
ææåå¸¸å¸¸ææ® key é¯æä»¤ææ¯è¨ä¸èµ·ä¾
妿æåæ git st 就表示 git status é£è©²æå¤æ£!!!
æä»¥æåå¯ä»¥èªå·±è¨å®ï¼è® Git 以徿 git st = git status å¦ä¸åï¼åæ¬ä¸è½ä½¿ç¨ git st ï¼è¨å®å®ä¹å¾å°±å¯ä»¥ä½¿ç¨äºã
git config --global alias.st status
git config --global alias.br branch
git config --global alias.ck checkout
git config --global alias.sw switch
git config --global alias.cm commit
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"
å°åé¢éä¸å¤§ä¸²è®æä¸åå¥åï¼é樣以å¾åªéè¦å·è¡ git lg
å³å¯ï¼
å¯è½æäººæåï¼é£éåè¨å®æªæä»¶å¨åªè£¡å¢?
é常æå¨ä½ ç使ç¨è åºä¸ï¼ä¾å¦æéå°é»è ¦ä½¿ç¨è çº HJï¼è¨å®æªæä»¶å°±æå¨ C:\Users\HJ åºä¸ï¼
仿¯ä¸å é±èæä»¶.gitconfig ï¼æéä»çè©±æ ¼å¼å¦ä¸ã
ä¸ç¥éå¤§å®¶ææ²ææ³¨æå° --global
éå忏ï¼ä»ä»£è¡¨çæææ¯å
¨åçï¼å¦æèªªä½ ä»å¤©æ¯å·è¡
git config alias.stu status
ä»£è¡¨åªæå¨è©²ç®éåºä¸ææææä½ç¨ã
é£éåæä»éº¼ç¨å¢ï¼ 試æ³ä¸ç¨®æ å¢ï¼åè¨ä½ å¨ç¹å®çè³æå¤¾åºä¸ï¼æ³è¦ä½¿ç¨ç¹å®çä¿¡ç®±å» pushï¼èå ¶ä»çè³æå¤¾ï¼
å䏿¨£ä½¿ç¨å ¬å¸çä¿¡ç®±ï¼éæåï¼å°±é常é©å使ç¨éç¨®æ¹æ³å®æã
æ´å¤è³è¨ç´°ç¯å¯ä½¿ç¨ä»¥ä¸å½ä»¤æ¥ç
man git-config
git æ´æ°
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
ä½¿ç¨ Git 䏿¬¡ Push å°å¤åä¸åçé 端 ( remote )
å妿ä¸å¤© github æäºï¼é樣æ¯ä¸æ¯å°±ä¸è½ work äºï¼ä½ å¯è½æèªªæ¬å°ç«¯éæ ?
ä½......å¤å份çµå°æ¯å¥½äº !! åé裡ä»ç´¹å¦ä½ä¸æ¬¡ Push å°å¤åä¸åçé 端 ( remote )
éè£¡ç¨ Bitbucket ç¶ä½ç¯ä¾
å 使ç¨ä¸æ¹æä»¤æ¥ç
git remote -v
git remote éåæä»¤çæ´å¤èªªæå¯åè宿¹æä»¶ git-remoteã
æ¥èæå使ç¨ä¸åæä»¤æ°å¢ä¸å origin çé 端
git remote set-url --add origin <url>
git remote set-url --add origin git@github.com:twtrubiks/test2.git
æååç¨ git remote -v æ¥ç䏿¬¡ï¼ä½ æç¼ç¾å¤äºååæ°å¢çé 端 ( remote )
æå¾æåå push
ä»ç´°çï¼æ¯ä¸æ¯ä¸æ¬¡ push å°å¤åä¸åçé 端 ( remote )ï¼é常æ¹ä¾¿!!
GitHub
Bitbucket
P.S è¨å®æªå¨è³æå¤¾åºä¸çé±èæª ".git" åºä¸ï¼è£¡é¢æä¸å config
è£å å¹¾å git remote çæä»¤ï¼ä»ä¹æ¯æ´ rename 以å remove ï¼
ç¾å¨ç remote å¦ä¸ï¼
è®æåéæ°å½å remoteï¼èªæ³å¦ä¸ï¼
git remote rename <old> <new>
git remote rename origin2 origin
å·è¡å¾ï¼ä½ æç¼ç¾ remote æåè¢«ä¿®æ¹æ origin äºï¼
æ¥ä¸ä¾æå試試 removeï¼èªæ³å¦ä¸ï¼
git remote remove <name>
git remote remove origin
æååªé¤ï¼ç¾å¨ remote æ¯ç©ºçäºï¼
æ¥ä¸ä¾æåå試æ°å¢ä¸å remoteï¼æä»¤å¦ä¸ï¼
git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>
git remote add origin git@github.com:blue-rubiks/t11.git
妿æåæ³ä¿®æ¹ origin ç urlï¼å¯ä»¥ä½¿ç¨
git remote set-url origin git@blue.github.com:blue-rubiks/t11.git
Multiple SSH Keys settings for different github account
Multiple SSH Keys settings for different github account
Git-Flow åºæ¬æå¸ä»¥åæ¦å¿µ
Git-Flow åºæ¬æå¸ä»¥åæ¦å¿µ
PR (Pull Request) æå¸
-
Youtube Tutorial - github PR (Pull Request) æå¸ - æç« å¿«éé£çµ
-
Youtube Tutorial - github CLI PR æå¸ - gh - æç« å¿«éé£çµ
Linux 注æäºé
é鿝å大家說ä¸äºåæå¨ windows 以å linux åºä¸ä½¿ç¨ git å¯è½æéå°çåé¡.
é¦å , å¨ linux åºä¸å·è¡ä»¥ä¸æä»¤
sudo chmod -R 777 folder
git æé»èªå®çºæ¹è®, è¦æéº¼æå®å¿½ç¥å¢ ? è«å·è¡ä»¥ä¸æä»¤ ,
git config core.fileMode false
ä¹å¯åèéç¯æç« Git ignore file mode (chmod) changes
æ ¼å¼å
core.autocrlf
Windows ä½¿ç¨ Enter (Carriage Return ç°¡å¯«çº CR) å æè¡(Line Feed ç°¡å¯«çº LF) éå ©ååå ä¾å®ç¾©æè¡,
è Mac å Linux åªä½¿ç¨ä¸åæè¡ (Line Feed ç°¡å¯«çº LF) åå .
æä»¥æå°è´è·¨å¹³å°å使åºåé¡.
å¨ windows ä¸å¯ä»¥é樣è¨å® ( 代表 LF æè¢«è½ææ CRLF)
git config --global core.autocrlf true
Linux æ Mac 系統
git config --global core.autocrlf input
以ä¸é樣è¨å®, æå¨ Windows ä¸ä¿ç CRLFï¼èå¨ Mac å Linux 以å repo ä¸ä¿ç LF.
å¦æä½ æ³æ´æ·±å ¥çäºè§£, å¯åè æ ¼å¼å-core.autocrlf.
ä¿®æ¹ editor
git config --global core.editor "vim"
Reference
Donation
æç« 齿¯æèªå·±ç ç©¶å §åå¾ååµï¼å¦ææå¹«å©å°æ¨ï¼ä¹æ³é¼åµæçè©±ï¼æ¡è¿è«æå䏿¯åå¡ :laughing:
ç¶ çç§æECPAY ( ä¸é註åæå¡ )
æä»å¯¶ ( é註åæå¡ )
è´å©åå®
Top Related Projects
Most commonly used git tips and tricks.
Flight rules for git
Pro Git 2nd Edition
A collection of useful .gitignore templates
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot